GCC 学习篇
利用上周和周末的时间, 学习了GCC相关的知识.
虽然在以前学习C的时候有接触过(gcc 的命令选项、 头文件、 宏定义、 头文件路径、 cpp(C语言预处理器)等知识 ),
但是在项目中还是发现遇到很多问题,
比如:
1、为什么宏定义使用do{...}while(0)
?
2、项目中的日志打印系统是怎么弄的?
3、C预处理器后的文件中的数字都是代表什么意思?
4、makefile文件中编译项目使用的GCC的选项有什么作用?
5、等等问题吧.
终于上周我在官网学习了这些知识,
1、为什么宏定义使用do{...}while(0)
?
定义宏的时候如果有多条语句; 需要{ }
把几条语句合起来…
不然替换到代码中可能由于括号等优先级等出现语法、逻辑错误.
#define device_init_wakeup(dev,val) \
{ \
device_can_wakeup(dev) = !!(val); \
device_set_wakeup_enable(dev,val);}
如果使用的细致, 替换后不出现问题也是可以的.
但是 类函数宏 调用的时候就应该像函数那样.
if(n > 0)
device_init_wakeup(d, v);
展开后为
if(n > 0)
{device_can_wakeup(dev) = !!(val);
device_set_wakeup_enable(dev,val);} ;
else
-
问题就出现在最后的那个
;
,这样就会多一个空语句. -
if 语句被;结束掉了,没法和else配对 (会出现语法错误)
规范语法书写!!
if(n > 0){
device_can_wakeup(dev) = !!(v