我正在尝试编译以下代码:
#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的编译?
答案 0 :(得分:4)
问题是extern "C"
部分,因为这使得函数可以从C(以及其他所有可以调用C函数的函数)调用,它们没有名称空间,这意味着两个函数都是相同的C可调用符号。
它与Clang无关,它是一个C ++的东西所以不应该与任何编译器一起使用。
在C ++ 11标准(2012年的ISO / IEC 14882:2011(E))中,相关段落在§7.5/ 6中,最重要的是开头:
最多一个具有特定名称的函数可以具有C语言链接。对于具有相同函数名称的C语言链接的函数的两个声明(忽略限定它的命名空间名称)出现在不同的命名空间范围内引用相同的函数。
关于错误消息,规范也说
...如果声明出现在不同的翻译单元中,则无需诊断