为什么以下方法获得内部链接?

时间:2016-02-02 14:02:48

标签: 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_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_something,则会显示有关内部关联的警告。

上面定义的方法如何具有内部链接?方法获取内部链接的所有情况是什么?

看到这个函数和其他人,用于编译很好,甚至在重构过程中都没有被触及,什么样的副作用(包括顺序,类型Foo和Bar)可以导致方法切换到内部链接?

编辑:

当我执行do_something的完整源代码grep时,它会给出三个结果:

X.hppvoid do_something(

X.cppvoid X::do_something(

Y.cppx->do_something(

我还尝试将do_something的名称更改为长保证的唯一名称,以排除任何名称冲突的可能性。

据我所知,发布的方法定义无疑是被标记为具有内部链接的方法。

1 个答案:

答案 0 :(得分:1)

这是由于其中一种类型(即foo:Foo)是模板类型,其中一个 模板参数 错误地获得了内部链接。< / p>

template <typename char const* Name> struct Foo{...};

const char constexpr FooBarName[] = "Bar";

using FooBar = Foo<FooBarName>;

FooBar在任何参数列表中的存在或作为返回类型都会给该方法内部链接。即使clang-3.8 -Weverything extern const char抱怨有一个带内部链接的模板参数。

明显的解决方法是正确使用{{1}}作为模板字符串参数。