这是一个示例代码:
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)
此函数是内联的,位于多个编译单元中使用的标头中.这里的目标是在没有使用此函数的情况下使编译器不执行任何操作.
问题:
是的,该标准保证只有一个对象.来自C++03§7.1.2/ 4:
[...] 函数中的
static局部变量extern inline始终引用同一个对象.extern内联函数中的字符串文字是不同翻译单元中的相同对象.
(注意,extern inline函数是inline具有外部链接的inline函数,即未标记为的函数static.)
它出现在哪个目标文件中取决于编译器,但我怀疑发生的是每个使用它的目标文件都会获得一个副本,链接器将任意选择其中一个符号并丢弃其余的符号.