当前位置:编程学习 > C/C++ >>

我也要学C语言-第十二章:编译预处理——不带参数的宏

C语言的宏是用来间接的操作编译环境的。

  C语言在对源程序进行正常编译之前,先对一些特殊的预处理命令作解释,产生一个新的源程序,之后再进行通常的编译(要得到中间文件加参数/p)。

  在源程序中,为了区分预处理命令和一般的C语句的不同,所有预处理命令行都以符号#开头并且宏一定要大写哦,因为大家都是这样做的,并且结尾不用分号。

  预处理命令可以出现在程序的任何位置,但是习惯上尽可能地写在源程序的开头,其作用范围从其出现的位置到文件尾。

不带参数的宏定义:

  #define 标识符 语句序列或者表达式

  它的作用是在编译预处理时,将源程序中所以标识符替换成语句序列。

  宏常常用来定义符号常量,简化一些标识符的书写,部分的弥补了C语言没有元素个数可变的数组的不足:例子:

#include <stdio.h>#define IN scanf#define OUT printf#define N 2void main(){    int i = 0;    char name[N][20];    long num[N];    OUT("Please input name and ID: ");    for(i; i<N; i++)    {        IN("%s", name[i]);        IN("%ld", &num[i]);    }        for(i=0; i<N; i++)    {        OUT("%s ", name[i]);        OUT("%ld ", num[i]);    }}
我们把这段代码在VC6.0中编译不链接,编译不链接在VC6.0IDE的设置是这样的,打开:

在Project Options后面加上/P参数。这样你选择只编译

就可以就得到编译预处理后的.i文件。我们再打开.i文件看看:

我们可以看到,N都被替换为2了,IN都替换为scanf了,OUT被替换为printf啦!所以这样的控制编译器预处理的语句通常叫预处理命令!

不带参数的宏的好玩的地方。看代码:

  

#include "stdio.h"#define dodolook int g_a1 = 0x12345678;static int g_a2 = 0x87654321;dodolook void go(){    //?x@?1??go@@YAXXZ@4HA    static int x = 0x88888888;    printf("%08x", x);}int main(){    //?x@?1??main@@9@4HA    static int x = 0x12312312;    int a = 111;    int b = 222;    dodolook go();    return (0);}

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,