C标准:ODR和constexpr std :: string_view
作者:互联网
如果我有一个包含foo.h的头文件
#ifndef FOO_H_
#define FOO_H_
namespace foo {
constexpr std::string_view kSomeString = "blah";
}
#endif // FOO_H_
那么在单个程序中的多个.cc文件中包含foo.h是安全的,无论它们使用符号kSomeString做什么,或者是否有一些可能导致ODR违规的用途?
另外,是否可以保证kSomeString.data()将在.cc文件中返回相同的指针?
如果可能的话,我想特别提及C++ standard中的措辞.谢谢!
解决方法:
仅包括来自多个翻译单位的foo.h不会违反ODR.但实际上,kSomeString的一些用途会违反ODR.有关详细信息和标准措辞,请参见此处:https://stackoverflow.com/a/34446445
不能保证kSomeString.data()将在所有翻译单元中返回相同的值,因为不能保证字符串文字“blah”在所有翻译单元中都是相同的对象.根据[lex.string]/16,
Evaluating a string-literal results in a string literal object with static storage duration, initialized from the given characters as specified above. Whether all string literals are distinct (that is, are stored in nonoverlapping objects) and whether successive evaluations of a string-literal yield the same or a different object is unspecified. [ Note: The effect of attempting to modify a string literal is undefined. — end note ]
在C17中,可以通过将kSomeString定义为内联来防止潜在的ODR违规.这将赋予它外部链接,从而在整个程序中提供单个地址(见[basic.link]/3和[basic.link]/4),并允许它进行多重定义(见[basic.def.odr]/4).显然.data()只能返回一个可能的值.
标签:one-definition-rule,linkage,c,language-lawyer,c17 来源: https://codeday.me/bug/20190727/1551378.html