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:我添加了一些我认为涵盖了所有问题的信息(它们都是关于可能与其他方法混淆,对吗?)