Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有任何理由再使用extern作为常量?_C++_C++20 - Fatal编程技术网

C++ 是否有任何理由再使用extern作为常量?

C++ 是否有任何理由再使用extern作为常量?,c++,c++20,C++,C++20,在我早期的日子里,我经常有这样的想法: // .h extern const int MY_CONST; // .cpp const int MY_CONST = 5; 这是否真的被以下内容完全取代: // .h inline const int MY_CONST = 5; 现在有什么理由使用第一种变体吗 请注意,后者具有更高的可读性,因为该值在头文件中可见(自文档化)。当然。出于同样的原因,人们可能希望在单独的翻译单元中定义任何内容。例如,同样的推理也适用于函数定义 例如,一个原因可能是

在我早期的日子里,我经常有这样的想法:

// .h
extern const int MY_CONST;

// .cpp
const int MY_CONST = 5;
这是否真的被以下内容完全取代:

// .h
inline const int MY_CONST = 5;
现在有什么理由使用第一种变体吗


请注意,后者具有更高的可读性,因为该值在头文件中可见(自文档化)。

当然。出于同样的原因,人们可能希望在单独的翻译单元中定义任何内容。例如,同样的推理也适用于函数定义

例如,一个原因可能是,如果您想更改初始化器,就不需要根据变量重新编译所有内容


另一个原因可能是初始化很复杂,涉及到调用一个您希望隐藏的函数,因为您可能不希望依赖项是公共的。

Hmm,现在编写
constepr int MY_CONST=5
可能更好-他们发明内联方案的原因是什么DI会说,最好不要对常量使用大写字母。这是一种反模式,它的工作方式与创建它的方式完全相反。
constexpr
在全局范围内不是内联的default@Slava你说的
是什么意思?它的工作原理与它的创建方式完全相反?不使用大写字母的唯一原因是避免与宏冲突,这些宏通常用UpPaseC..T.NIESE编写,这种习惯来自C++常量定义C方式时使用预处理器宏的时候。预处理器宏都是大写的,以避免与非宏内容冲突。现在常量不再是宏了,但这个旧习惯仍然存在,并且以相反的方式工作——增加冲突的概率,这在涉及预处理器时是令人讨厌的。人们太懒了,以至于记不起导致这个习惯的原因,当它不再是实际的时候就停止它。另外,初始化可能依赖于另一个全局对象的先前初始化,或者其他对象的初始化可能依赖于这个对象的初始化,您必须通过将两个对象放在同一个源文件中来确保正确的初始化顺序+1.@PeteBecker它们仍然可以都是在同一标题中定义的内联变量。