博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言中使用宏,需要注意的的几点
阅读量:6257 次
发布时间:2019-06-22

本文共 996 字,大约阅读时间需要 3 分钟。

使用#define来定义一些宏,进行一些简洁的替换甚至一些带参数的宏,在linux c代码中很常见,说明它很好、很有用,

但是它也有一些复杂的规矩和陷阱需要注意,下面我记录一些,仅供参考。

1、当使用"\"来换行时,第二行要顶格写,否则会多出一个空格。例如:

#define OW "what are you doi    \

       ng?"
第二行的ng?"没有顶格写,那么进行替换的时候,会这样:
what are you doi        ng?
正确的定义为:
#define OW "what are you doi\
ng?"

2、宏可以替换数组的长度,但是const定义的常量不可以。

#define LIMIT  60

const int LMT=12;
int a[LIMIT];     //有效

int a[LMT];        //无效

原因:在C中,非自动数组的大小应该是整型常量表达式,这意味着数组大小必须是
整型常量的组合(如5)、枚举常量和sizeof表达式,但不包括const声明的值。

3、多写逗号导致的错误。

可以用__VA_ARGS__进行可变个数的传参,但是_VA_ARGS__在函数体内不要私自加上逗号,比如:

#define PR(x,...)   printf("Message "#x":" __VA_ARGS__)

如果写成:

#define PR(x,...)   printf("Message "#x":" ,__VA_ARGS__)

就会报错,原因是"Message "#x":"并非和前面的x对应关系,_VA_ARGS__里面仍然可以有字符串。

一个完整的小例子:

1 #include 
2 3 #define PR(x,...) printf("Message "#x":" __VA_ARGS__) 4 5 int main(void) 6 { 7 double x=48; 8 double y; 9 y=x*x;10 PR(1,"x=%g\n",x);11 PR(2,"ping fang of x is %.2f\n",y);12 13 return 0;14 }

 

转载地址:http://hcxsa.baihongyu.com/

你可能感兴趣的文章
javascript运算符优先级
查看>>
Spring Cloud 学习 (七) Spring Cloud Sleuth
查看>>
使用docker api
查看>>
Log4j简单配置解析
查看>>
游戏上线... 记录下...
查看>>
js运动 淡入淡出
查看>>
leetcode 75颜色分类
查看>>
程序员求职成功路(3)
查看>>
Winform 打印PDF顺序混乱,获取打印队列
查看>>
django 快速搭建blog
查看>>
datetime.timedelta类
查看>>
SQL Server,MySQL,Oracle三者的区别
查看>>
[K/3Cloud] 在设计时复制已有表单菜单或菜单项快速建立菜单
查看>>
矩阵快速幂总结
查看>>
[spring] Ioc 基础
查看>>
关于DataTables一些小结
查看>>
win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
查看>>
Hibernate的基本配置
查看>>
Python 3.5 安装geohash库后import geohash失败
查看>>
总结100个英文邮件常用例句让你写作无忧
查看>>