clang重新定义不同命名空间中的符号错误

时间:2014-07-22 12:54:32

标签: c++ g++ clang linker-errors

我正在尝试编译以下代码:

#include <iostream>

extern "C" {
inline void blah() {
    std::cout << "123" << std::endl;
};
}

namespace NN {
extern "C" {
inline void blah() {
    std::cout << "123" << std::endl;
};
}
}

int main() {
    blah();
    return 0;
};

g ++编译没有错误,但是clang:

x.cpp:11:13: error: redefinition of 'blah'
inline void blah() {
            ^
x.cpp:4:13: note: previous definition is here
inline void blah() {
            ^
1 error generated.

是否可以修复clang的编译?

1 个答案:

答案 0 :(得分:4)

问题是extern "C"部分,因为这使得函数可以从C(以及其他所有可以调用C函数的函数)调用,它们没有名称空间,这意味着两个函数都是相同的C可调用符号。

它与Clang无关,它是一个C ++的东西所以不应该与任何编译器一起使用。


在C ++ 11标准(2012年的ISO / IEC 14882:2011(E))中,相关段落在§7.5/ 6中,最重要的是开头:

  

最多一个具有特定名称的函数可以具有C语言链接。对于具有相同函数名称的C语言链接的函数的两个声明(忽略限定它的命名空间名称)出现在不同的命名空间范围内引用相同的函数。

关于错误消息,规范也说

  

...如果声明出现在不同的翻译单元中,则无需诊断

GCC错误报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25940

相关问题