C++ C++;构造函数具有内部链接,但未定义[-Wundefined internal]
我从9.0.0版的C++ C++;构造函数具有内部链接,但未定义[-Wundefined internal],c++,clang++,C++,Clang++,我从9.0.0版的clang中得到了一个恼人的警告 function'(匿名命名空间)::B::B'具有内部链接,但未定义[-Wundefined internal] (g++给我一个类似的警告“X已使用但从未定义”) 其他问题是关于内联或静态函数,但这不是我的情况 下面是一个最小的不起作用的示例: :A.cpp: #包括“B.hpp” 名称空间{ 甲级{ 公众: 布尔富(内部和酒吧){ B*B=新的B(&bar); 返回0; } }; } int main(){ 返回0; } :B.cpp
clang
中得到了一个恼人的警告
function'(匿名命名空间)::B::B'具有内部链接,但未定义[-Wundefined internal]
(g++
给我一个类似的警告“X已使用但从未定义”)
其他问题是关于内联
或静态
函数,但这不是我的情况
下面是一个最小的不起作用的示例:
:A.cpp:
#包括“B.hpp”
名称空间{
甲级{
公众:
布尔富(内部和酒吧){
B*B=新的B(&bar);
返回0;
}
};
}
int main(){
返回0;
}
:B.cpp:
#包括“B.hpp”
名称空间{
B::B(int*B):B(B){};
}
:B.hpp:
\ifndef水电站
#定义B_水电站
#布拉格语一次
名称空间{
B类{
公众:
B(int*B);
私人:
int*b;
};
}
#endif//B_水电站
。。。编撰
clang++A.cpp B.cpp
以下是来自叮当声的警告:
function'(匿名命名空间)::B::B'具有内部链接,但未定义[-Wundefined internal]
我的问题是:为什么构造函数B
不被识别
这是一个匿名名称空间。匿名名称空间是特殊的。每个转换单元的匿名命名空间都是唯一的:A.cpp中的匿名命名空间与B.cpp中的匿名命名空间完全不同
此行声明在匿名命名空间中声明的B
的构造函数
此行调用A.cpp中的构造函数。除非定义了(A.cpp的匿名命名空间)::B::B
,否则程序的格式不正确
这定义了(B.cpp的匿名命名空间)::B::B
。请注意,此函数以及类本身与另一个翻译单元中的函数无关
由于(A.cpp的匿名名称空间)::B::B
没有定义,因此程序的格式不正确
所有具有内部链接(使用odr)的函数必须在使用它们的同一翻译单元中定义,因为它们不能在其他任何地方定义。如果函数在命名空间作用域中声明为静态(静态在类作用域中具有不同的含义),或者在匿名命名空间中声明,则函数具有内部链接。匿名(未命名)命名空间中的符号将具有内部链接(如错误所述),并且无法从转换单元导出。这类似于使用静态
关键字定义符号。有关详细信息,请参见,例如。头文件中有匿名命名空间。那没有任何好处。谢谢你(和上面的评论)的解释。因此,避免上述警告的一种方法是删除B.*pp
的匿名名称空间。(在现实世界中,我需要保留A.cpp
的匿名名称空间。)
namespace {
B(int* b);
B* b = new B(&bar);
B::B(int* b) : b(b) {};