C++ #ifndef用于包含文件,为什么所有大写都用于头文件?

foo*_*foo 3 c++ header-files c-preprocessor

我想知道为什么#ifndef指令后面的名字总是全部大写并且似乎与实际头文件的名称不匹配?这有什么规则?我一直在寻找网络,但我没有找到任何解释.如果我的头文件名为myheader.h,那么可以使用:

#ifndef MYHEADER
Run Code Online (Sandbox Code Playgroud)

如果是这样,为什么?规则是什么?

SLa*_*aks 6

这些是预处理程序符号,没有这样的规则.(只要它们与#defines标题中的匹配)

但是,惯例是对预处理程序符号使用全大写.


Mat*_*lia 6

没有"规则",只有惯例.第一个也是最常用的约定是所有预编译宏都是大写的,所以标题保护也应该都是大写的.

至于宏名称,我使用的(以及我看到的大多数代码使用的)只是标题的名称(如上所述,转为全部大写),包括扩展名,用下划线替换点,然后是_INCLUDED.

#ifndef MYHEADER_HPP_INCLUDED
#define MYHEADER_HPP_INCLUDED
// ...
#endif
Run Code Online (Sandbox Code Playgroud)

请注意,许多前缀此类标识符带有下划线或双下划线,但这不是一种好的做法,因为标准指定标识符开头(或包含)双下划线,以及以单个下划线后跟大写字母开头的标识符保留给编译器/所有范围内特定于库的东西(例如VC++中的__declspec或标准头中使用的宏); 以单个下划线开头的所有其他标识符都保留在全局范围内.因此,不应使用此类标识符来避免冲突.

这个东西更多信息在这里.