【注:本程序验证是使用vs2013版】
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) /* #define 1、定义一个标识符来表示一个常量。 2、特点:定义的标识符不占变量内存,占用的是程序空间的内存,预编译后这个符号就不存在了。 3、预编译所执行的操作就是简单的“文本”替换 4、使用:#define 标识符 常量 //注意, 最后没有分号 #undef M //宏的中止位置 */ /* 1、宏只是简单的替换,在预编译时将程序中出现前面的内容,用后边的完全替换 */ # define NUM 5 // #undef 之前出现的 NUM 全部用5代替 #define b "at" //"at" 会在程序会完全替代 b /* #define c "at 宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。 #define 0x abcd 宏定义前面的那个必须是合法的用户标识符 */ /* 2、带参的宏, 每个宏变量都要加括号 遇到MAX(1+2,value)则会把它替换成:((1+2)>(value)?(1+2):(value)) 如果不括起来, 遇到MAX(1+2,value)则会把它替换成: 1+2>value?1+2:value 这样什么运算都不是了,会报错 */ #define MAX(a,b) ((a)>(b)?(a):(b)) /* 3、'#'用于把宏定义中的参数两端加上字符串的"" 比如,这里STR(my#name)会被替换成"my#name" 一般由任意字符都可以做形参,但以下情况会出错: STR())这样,编译器不会把“)”当成STR()的参数。 STR(, )同上,编译器不会把“, ”当成STR的参数。 STR(A, B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例) STR((A, B))会被解读为实参为:(A, B),而不是被解读为两个实参,第一个是(A第二个是B)。 */ #define STR(str) #str /* 4、‘##’用于实现函数实参中多个参数的 使用 例如:#define FUN(a,b) vo##a##b() 那么FUN(id ma,in)会被替换成void main() */ /* 5、多行宏定义 #define doit(m,n) for(int i=0;i<(n);++i)\ {\ m+=i;\ } */ int main(void){ int a= NUM; printf("a=%d\n",b);
#undef NUM
//int a2= NUM; //这里再使用NUM就会报错 printf("%s\n", b);
printf("MAX(1,2) = %d\n",MAX(1,2));
printf("\n"); system("pause"); return 0; }