C++ 为什么以下方法会获得内部链接?
我正在使用C++ 为什么以下方法会获得内部链接?,c++,linkage,C++,Linkage,我正在使用clang-3.6并编译一个相当大的项目。经过大规模重分解后,少数类中的少量看似随机的方法会导致如下警告: warning: function 'namespace::X::do_something' has internal linkage but is not defined [-Wundefined-internal] 同样的函数在链接器阶段中也会丢失 以下是X.hpp中一个此类函数定义的匿名标题: class X { // ... void do_someth
clang-3.6
并编译一个相当大的项目。经过大规模重分解后,少数类中的少量看似随机的方法会导致如下警告:
warning: function 'namespace::X::do_something' has internal linkage but is not defined [-Wundefined-internal]
同样的函数在链接器阶段中也会丢失
以下是X.hpp
中一个此类函数定义的匿名标题:
class X {
// ...
void do_something(
foo::Foo& foo,
double a
double b,
double c,
uint8_t d,
const bar::Bar& bar,
int dw, int dh);
// ...
}
该功能在X.cpp
中正常实现。当Y.cpp
包含X.hpp
并执行X->do\u something
时,会出现关于内部链接的警告
上面定义的方法如何具有内部链接?在什么情况下,方法可以获得内部链接
鉴于此函数和其他函数用于编译,而且在重构过程中甚至没有被触及,什么样的副作用(包括顺序、Foo和Bar类型)会导致方法切换到内部链接
编辑:
当我对dou\u something
进行完整的源代码grep时,它会给出三个结果:
X.hpp
:void do\u某事(
X.cpp
:void X::做点什么(
Y.cpp
:x->做点什么(
我还尝试将do\u something
的名称更改为一个长期保证的唯一名称,以排除名称冲突的可能性
据我所知,发布的方法定义毫无疑问是被标记为具有内部链接的方法。这是由于其中一种类型(即
foo:foo
)是一种模板类型,其中一个模板参数错误地获得了内部链接
template <typename char const* Name> struct Foo{...};
const char constexpr FooBarName[] = "Bar";
using FooBar = Foo<FooBarName>;
模板结构Foo{…};
const char constexpr FooBarName[]=“Bar”;
使用FooBar=Foo;
在任何参数列表中出现FooBar或作为返回类型,都会给该方法带来内部链接。甚至连clang-3.8
和-Weverything
都抱怨有一个带有内部链接的模板参数
template <typename char const* Name> struct Foo{...};
const char constexpr FooBarName[] = "Bar";
using FooBar = Foo<FooBarName>;
明显的修复方法是正确地使用
extern const char
作为模板字符串参数。如果您非常仔细地检查声明和定义的函数签名,您是否绝对确定它们没有区别?一些“陷阱”是大写、参数类型和/或限定符、函数限定符、存储类、调用约定,还是忘记添加名称空间或类名。成员是公共的
?成员在类中默认为私有的
。我还想添加另一个“gotcha”,基于您关于从未修改过这些类的评论。即:头保护。您是否认为您可能无意中将头保护复制粘贴到了其他文件中,并且它恰好排除了正确的类声明?您是否以某种方式将此类放入匿名命名空间中?例如,头保护/名称空间冲突,比如@paddy:我添加了一些我认为涵盖了所有问题的信息(它们都是关于可能与其他方法混淆,对吗?)