C++的一个编绎错误引发的问题分析 expected unqualified-id before ‘(’ token

    今天在编绎一段代码的时候,忽然间,出现了一个比较诡异的错误,长这个样子【expected unqualified-id before ‘(’ token】,这里上个图可能会清楚一些。


报错位置在X_pb.h文件的317行(X_pb.h这个文件是protobuf自动生成的)。第一反应即是这个文件是自动生成的,怎么可能会有问题?别急,我们一点点来看。找到这个文件的317行。

C++的一个编绎错误引发的问题分析 expected unqualified-id before ‘(’ token_第1张图片

眼睛瞪到最圆的程度,盯了30秒,还是没能看出啥东西来。

解决方案一:求助google和百度

把关键字expected unqualified-id before ‘(’ token敲进去,找了半天,没有一个像是我遇到的问题。

解决方案二:排除法。

把使用到这个protobuf相关的代码去掉,看是不是这个文件引起的。试了一下,去掉能够编绎成功。那就说明是这个文件引起的。

进一步:为什么是这一行出错?有什么不一样的地方么?

我尝试了一下,换个名字试试,把errno()这个函数名换了一个,奇怪了,居然就编过去了。还真就这行出问题了。

进一步提出问题:为什么errno()这个会有问题?这个名字难道跟谁冲突了吗?

顺着这个思路,把代码改回去,使用预编绎工具,把代码做下预编绎处理,使用g++ -E 的方法,把出问题的.cpp进行处理,看看里面长什么样子。

找到大致问题所在的地方,我们发现,在定义到errno()函数的地方,被动了手脚了。如下图所示:

C++的一个编绎错误引发的问题分析 expected unqualified-id before ‘(’ token_第2张图片

居然被替换成了__errno_location(),在不远处,发现这是一个宏定义搞的鬼。

#define errno (*__errno_location())

至此,问题已经找到直接原因,是因为代码中,引入了#include 中,存在这个宏定义,宏定义在预编绎阶段,直接把我的函数名称给改掉了。

解决方案:

1、可以不要用这个函数名,直接换一个。

2、在这个文件开始处,使用#undef errno,去屏蔽这个宏的干扰,让这个函数能正常通过预编绎阶段。


你可能感兴趣的:(C/C++,工作,linux)