C++宏定义及相关问题
一、遇到错误expected initializer before ‘class’
根据这一篇 博客 的解释,编译时各代码会展开进行宏替换等操作,
正好在代码中定义了一些宏变量和自定义类型,报错却出现在一个库的头文件里面==>>是由于自定义类型句末少了一个“;”,说明这一句和那个头文件展开到一起了,导致了后者的错误。
typedef xxxx yyyy;
二、错误:error: expected ‘)’ before ‘{’ token (下面的if语句)
if (TIME_GAP < ABS(qt_length - rt_length) && q_start < q_end){ }
问题:需要补一个右括号,但是看if语句是没有问题的,而真的补上右括号后编译确实通过了,检查后发现问题出现ABS函数上
#define ABS(x) ((x)>=0?(x):(-(x)) # 绝对值函数宏定义(错误)
ABS函数是宏定义函数,会在编译时进行宏替换,由于该宏定义中最后少了一个右括号,进行替换后检查发现少一一个,所以实际编译的是
if (TIME_GAP < ((qt_length - rt_length)>=0?(qt_length - rt_length):(-(qt_length - rt_length)) && q_start < q_end){ }
其中的括号匹配情况是绿色背景显示的,就算按提示加了右括号编译通过,实际含义也遍历
解决:更正ABS宏函数定义,给定义式补上右括号