GCC、CPP学习篇

本文介绍了GCC的学习,包括宏定义的作用,GCC编译选项的使用,如中间过程文件、头文件路径和编译选项的意义。同时探讨了C预处理器的内容,如头文件、宏、预处理指令,并解析了预处理后文件中数字的含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值