gpt4 book ai didi

c++ - 变量声明冲突的编译器错误 : "conflicts with new declaration with ' C' linkage"

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:20 25 4
gpt4 key购买 nike

我遇到了一些无法在较新的编译器上构建的遗留代码。简化示例:

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 开始)和 clang 都标记了它。

Clang 的输出:

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 测试)

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

顺便说一句,我并不反对更改代码;我想知道除了“标准说这是错误的”之外,是否还有更多的事情在发生。

最佳答案

我浏览了各种 *stack 站点,发现大部分问题都是关于这个主题的,这些问题与链接规范冲突的函数有关。

我在 gcc bugzilla database 中找到了我的 [第一个] 答案:

The standard says in 7.5/5: "If two declarations of the same function or object specify different linkage-specifications [...] the program is ill-formed if the declarations appear in the same translation unit [...]". That is why code like that in comment 6 is now rejected.

无论我的假设是否正确(关于 POD 变量的 C/C++ 链接之间的功能差异),错误似乎是为了防止不良风格。

然后我找到了这篇关于storage class specifiers的文章还有一个关于 language linkage .我在那些文章中没有看到任何与我目前所学相冲突的内容;第二个说:

Likewise, two variables in the same namespace cannot have two different language linkages.

关于c++ - 变量声明冲突的编译器错误 : "conflicts with new declaration with ' C' linkage",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31349865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com