宏定义注意事项

以下信息整理至<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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值