我也要学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语言 ,