宏,单凭字面意思,我们无法根据汉语意思而推断其在计算机术语中大概何意。但现代计算机技术的发展丰富了其原本的意思。现在,我给出其意思:c语言(及以后的c++等)常用的一种为了避免函数调用而直接以代码替代宏名的替换模式。
为了进一步理解宏需掌握以下概念:
宏展开:预编译时用宏名所对应的代码直接代替源文件中各处出现的宏。例如:#define max(a,b) return ((a)>(b))? a : b
宏展开以为这源文件中所有出现 max(a,b) 的地方被替换成return ((a)>(b))? a : b。宏展开的好处是节省了函数调用压栈出栈的系统开销,提高程序运行速度。
宏展开何时进行:宏是编译器在预编译时自动完成的,不会再运行期间进行,运行期间已经是可执行的目标文件了。
宏符##和#
##和#只能在预定义语言中使用,即只能在#define #if等少数几个宏定义语句中使用。在通常的常规代码中会报错。
##是连接符,可以直接将两个变量名连接成一个变量名。如:
#define paste(a,b) a ## b
int aa =1;
int b =2;
int aab=3;
printf(":=%d",paste(aa,b));
将输出:=3
而#是将变量名字符串化。如
#define printout(n) printf(#n"=%d",n)
调用printout(n)等价于printf("n""=%d",n)
宏定义时代码超过一行时,在待续的代码后加"/",注意斜杠方向。并且,不能带任何注释,否则,编译出错。举例为:
#define swap(c,d) {/
int t;/
t = c;/
c = d;/
d = t;/
}
最后一行可不再加''/".