加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C标准:ODR和constexpr std :: string_view

发布时间:2020-12-16 10:07:34 所属栏目:百科 来源:网络整理
导读:如果我有一个包含foo.h的头文件 #ifndef FOO_H_#define FOO_H_namespace foo {constexpr std::string_view kSomeString = "blah";}#endif // FOO_H_ 那么在单个程序中的多个.cc文件中包含foo.h是安全的,无论它们使用符号kSomeString做什么,或者是否有一些可
如果我有一个包含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()只能返回一个可能的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读