2015-07-10 206 views
2

我遇到了一些遗留代码,它们无法构建在较新的编译器上。该归结例如:针对冲突变量声明的编译器错误:“与具有'C'链接的新声明冲突'

int x; 
extern "C" { int x }; // conflicts with C++ linkage above 
// note: without the braces it would've been equivalent to: 
// extern "C" { extern int x; } 
// 
// for reference, see the notes section here: 
// http://en.cppreference.com/w/cpp/language/language_linkage#notes 

老的编译器不下垂,但两者的gcc(如4.1.2)和铛举报。

锵的输出:

error: declaration of 'x' has different language linkage 

GCC的输出:

error: previous declaration of 'int x' with 'C++' linkage 
error: conflicts with new declaration with 'C' linkage 

这让我感到惊讶,因为编译器不以任何特殊的方式裂伤x,而据我所知没有什么不同关于除调试信息以外的目标文件(基于我公认的使用objdump/readelf进行浅测试)

我的问题:为什么这是一个错误,如果重新没有功能差异?

另外,我并不反对改变代码;我想知道是否有更多的事情不仅仅是“标准说这是不健康的”。

+0

请问为什么downvote? –

回答

3

我浏览了各种*堆栈网站,大多发现有关这个主题的问题,这些问题涉及具有冲突链接规范的函数。

我发现在我的gcc bugzilla database [首页]答:

标准说,在7.5/5:“如果同一个函数或对象的两个声明指定不同的联动规格[...]的如果声明出现在相同的翻译单元[...]中,则程序不合格“。这就是为什么评论6中的代码现在被拒绝的原因。

无论我的假设是否正确(关于POD变量的C/C++链接之间的功能差异),它显示错误是为了防止错误的样式。

然后我发现这篇文章约storage class specifiers和约language linkage。我没有看到那些与我迄今为止学到的内容相冲突的文章;第二个说:

同样,同一名称空间中的两个变量不能有两个不同的语言链接。