内联函数静态常量是否唯一?

Kla*_*aim 10 c++

这是一个示例代码:

enum Foo // or enum class whatever
{   BAR
,   STUFF
};

inline const char* to_string( const Foo& foo )
{
    static const char* const NAMES[] = 
    {    "BAR"
    ,    "STUFF"
    };
    // let's assume I have some boundary checks here, it's not the point
    return NAMES[foo];
};
Run Code Online (Sandbox Code Playgroud)

此函数是内联的,位于多个编译单元中使用的标头中.这里的目标是在没有使用此函数的情况下使编译器不执行任何操作.

问题:

  1. C++标准是否保证NAMES只存在于一个目标文件中,还是由编译器决定还是保证每个目标文件都有它的副本?
  2. 如果有多个副本,它会是一个链接问题(我假设我无法测试足够的编译器来检查).
  3. gcc,msvc和clang都会通过使最终的二进制文件只有一个NAMES实例来优化这种情况吗?

Ada*_*eld 7

是的,该标准保证只有一个对象.来自C++03§7.1.2/ 4:

[...] 函数中的static 局部变量extern inline始终引用同一个对象.extern内联函数中的字符串文字是不同翻译单元中的相同对象.

(注意,extern inline函数是inline具有外部链接的inline函数,即未标记为的函数static.)

它出现在哪个目标文件中取决于编译器,但我怀疑发生的是每个使用它的目标文件都会获得一个副本,链接器将任意选择其中一个符号并丢弃其余的符号.