我见过人们使用两种方法来声明和定义char *
.
方法1:头文件有以下内容
extern const char* COUNTRY_NAME_USA = "USA";
方法二:
头文件有以下声明:
extern const char* COUNTRY_NAME_USA;
cpp 文件的定义如下:
extern const char* COUNTRY_NAME_USA = "USA";
- 方法1在某些方面是错误的吗?
- 两者有什么区别 ?
- 我理解“
const char * const var
“ , 和 ”const char * var
”。如果在上述方法中如果出现“const char * const var
" 像方法 1 一样在标头中声明和定义,这有意义吗?
第一种方法确实是错误的,因为它使得定义一个物体的COUNTRY_NAME_USA
with external头文件中的链接。一旦该头文件被包含到多个翻译单元中,就会违反单一定义规则 (ODR)。该代码将无法编译(更准确地说,它将无法链接)。
第二种方法是正确的。关键词extern
不过在定义中是可选的,即在 cpp 文件中你可以这样做
const char* COUNTRY_NAME_USA = "USA"
假设头文件中的声明在此翻译单元中位于该定义之前。
另外,我猜由于对象名称是大写的,它可能是一个constant。如果是这样,那么它应该被声明/定义为const char* const COUNTRY_NAME_USA
(注意额外的const
).
最后,考虑到最后一个细节,您可以将常数定义为
const char* const COUNTRY_NAME_USA = "USA"; // no `extern`!
在头文件中。由于它现在是一个常量,因此默认情况下具有内部链接,这意味着即使头文件包含在多个翻译单元中,也不会发生 ODR 冲突。在这种情况下,您会得到一个单独的COUNTRY_NAME_USA
每个翻译单元中的左值(而在extern
方法,您可以为整个程序获得一个)。只有您知道您的情况需要什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)