C++ C++;构造函数具有内部链接,但未定义[-Wundefined internal]

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

我从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:

#包括“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) {};