C语言的宏是用来间接的操作编译环境的。
C语言在对源程序进行正常编译之前,先对一些特殊的预处理命令作解释,产生一个新的源程序,之后再进行通常的编译(要得到中间文件加参数/p)。
在源程序中,为了区分预处理命令和一般的C语句的不同,所有预处理命令行都以符号#开头并且宏一定要大写哦,因为大家都是这样做的,并且结尾不用分号。
预处理命令可以出现在程序的任何位置,但是习惯上尽可能地写在源程序的开头,其作用范围从其出现的位置到文件尾。
不带参数的宏定义:
#define 标识符 语句序列或者表达式
它的作用是在编译预处理时,将源程序中所以标识符替换成语句序列。
宏常常用来定义符号常量,简化一些标识符的书写,部分的弥补了C语言没有元素个数可变的数组的不足:例子:
#include #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我们把这段代码在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);}
<script type="text/java script">
if (!isSyntaxHighlighted) {
try {
SyntaxHighlighter.all();
} catch (e) { }
}
<script src="/script/ShowHidden.js" type="text/java script">
<script type="text/java script">
if (!isSyntaxHighlighted) {
try {
SyntaxHighlighter.all();
} catch (e) { }
}
<script src="/script/ShowHidden.js" type="text/java script">
<script type="text/java script">
if (!isSyntaxHighlighted) {
try {
SyntaxHighlighter.all();
} catch (e) { }
}
<script src="/script/ShowHidden.js" type="text/java script">