我正在研究C programming a modern approach
本书。我在其中发现了一个问题:
为什么标识符包含多个相邻的下划线并不是一个好主意(例如,在current__balance中)?
任何人都可以向我解释为什么会这样吗?
答案 0 :(得分:8)
以C标准保留以两个下划线或下划线和大写字母开头的标识符,不应在您自己的代码中使用,参见ISO 9899:2011§7.1.3¶1#1:
7.1.3保留标识符
1每个标头声明或定义其相关子条款中列出的所有标识符,并可选地声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。 / p>
- 所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
- 如果包含任何相关标头,则保留以下任何子条款中的每个宏名称(包括未来的库方向)以供指定使用;除非另有明确说明(见7.1.4)。
- 以下任何子条款中包含外部链接的所有标识符(包括未来的库方向)和
errno
始终保留用作具有外部链接的标识符。 184)- 以下任何子条款中列出的文件范围的每个标识符(包括未来的库方向)都保留用作宏名称和文件范围的标识符,如果包含任何相关标题,则在同一名称空间中
2没有保留其他标识符。如果程序在保留它的上下文中声明或定义标识符(除了7.1.4允许的标识符),或者将保留标识符定义为宏名称,则行为是未定义的。
3如果程序删除(使用
#undef
)上面列出的第一个组中的标识符的任何宏定义,则行为未定义。184)具有外部链接的保留标识符列表包括
math_errhandling
,setjm
,va_copy
和va_end
。
对于名称中的双下划线:这些很难区分许多字体中的单个下划线并导致混淆。我建议你不要这样做。
答案 1 :(得分:2)
因为很难判断它是否有一个或两个下划线,所以当你意味着当前的平衡时,你可能会输入current_balance。
在类似的主题上,尽量不要将数字0和1与字母o和l混合,也不要制作仅在大小写方面不同的变量,例如:
bool boo1;
bool b00l;
int i_byte;
int i_Byte;