首页 > 技术文章 > C++宏定义及相关问题

grainrain 2021-09-29 16:49 原文

一、遇到错误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宏函数定义,给定义式补上右括号

 

推荐阅读