如果我有一个标题foo.h
包含
#ifndef FOO_H_
#define FOO_H_
namespace foo {
constexpr std::string_view kSomeString = "blah";
}
#endif // FOO_H_
那么,将它们包含在单个程序中的foo.h
多个.cc
文件中是否安全,无论它们对符号有何作用kSomeString
,还是有可能导致违反ODR的某些用途?
另外,是否可以保证kSomeString.data()
在.cc
文件之间返回相同的指针?
如果可能的话,我希望对C ++标准中的措词有特定的引用。谢谢!
仅包含foo.h
多个翻译部门的内容就不会违反ODR。但是,确实有一些使用kSomeString
会违反ODR。有关详细信息和标准措辞,请参见此处:https : //stackoverflow.com/a/34446445
它不能保证kSomeString.data()
将在所有的翻译单位返回相同的值,因为它不能保证该字符串字面量"blah"
是在所有的翻译单位相同的对象。根据[lex.string] / 16,
计算字符串字面量会导致字符串文字对象具有静态存储期限,并从上面指定的给定字符初始化。是否所有字符串文字都是不同的(即存储在不重叠的对象中)以及对字符串文字的连续求值是否得出相同或不同的对象,尚不确定。[ 注意:尝试修改字符串文字的效果是不确定的。—尾注 ]
在C ++ 17中,可以通过定义kSomeString
为来防止潜在的ODR违规inline
。这将使它具有外部链接,从而在整个程序中具有一个地址(请参阅[basic.link] / 3和[basic.link] / 4),并允许对其进行多重定义(请参阅[basic.def.odr] / 4))。显然.data()
只能返回一个可能的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句