黑马程序员技术交流社区

标题: 宏定义注意事项 [打印本页]

作者: 阿泽泽    时间: 2016-5-13 21:47
标题: 宏定义注意事项
以下信息整理至<c语言深度解剖>和百度:

3.1.3注释优先与预处理展看
#define BSC//
BSC tesg
结果编译会出错

3.14 用define宏定义表达式
#define SEC_A_YEAR (60*60*24*365)UL
#define SQR(x) ((x)*(x))
#define SUM(x) ((x)+(x))
#define EMPTY
printf("SUM(X)");
#define M 100
A:是,带参数的宏
B:EMPTY没有问题
C:SUM(X)
D:是,不带参数的宏

#define MAX(a,b) ((a)>(b)?(a):(b))
MAX(1+2,value)展开为((1+2)>(value)?(1+2):(value))

3.1.6 #undef 宏定义声明周期结束
#define X 3
#define Y X*2
#undef X
#define X 2
int z = Y;
printf("%d",z);
结果为4

3.6 #pragma预处理、
#define __PRAGMA_MESSAGE__TEST__
#ifdef __PRAGMA_MESSAGE__TEST__
    #pragma message("macao __PRAGMA_MESSAGE__TEST__ has defined")
#endif
pragma message标识的信息会打印出来

#pragma  warning(error:4081)
将警告号4081的改为错误

3.7 #运算符
#define SQR(x) printf("The square of x is %d\n",((x)*(x)));
#define SQR(x) printf("The square of "#x" is %d\n",((x)*(x)));
SQR(10);
结果:The square of 10 is 100

#define FUN1(a) "a"
#define FUN2(a) "#a"
#define FUN3(a) ""#a""

printf("%s\n",FUN1(345));
printf("%s\n",FUN2(345));
printf("%s\n",FUN3(345));
结果a #a 345

3.8 ##运算符
#define XNAME(n) x##n
char string1[] = "XNAME(8)";
printf("%s\n",string1);
结果:x8

others:
#define NAME "zhangyuncong"
printf("%s",NAME);
结果zhangyuncong
printf("%s","NAME");
结果NAME
""内部的不会被宏替换

#define 0x abcd
D:\sean\abc\test\test.cpp(60) : error C2007: #define syntax
定义前面的那个必须是合法的用户标识符

#define NAME "zhang
D:\sean\abc\test\test.cpp(64) : error C2001: newline in constant
宏定义也不是说后面东西随便写,不能把字符串的两个""拆开

也就是说,这种情况下记住:#define第一位置第二位置
(1)不替换程序中字符串里的东西。
(2)第一位置只能是合法的标识符(可以是关键字)
(3)第二位置如果有字符串,必须把""配对。
(4)只替换与第一位置完全相同的标识符
(5)还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算

多行宏定义
#define doit(m,n) for(int i=0;i<(n);++i)\
{\
m+=i;\
}

int m = 0,n = 10;
doit(m,n)
printf("%d\n",m);




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2