规则5.4:宏标识符应该是不同的
Required要求类规范。
该规则要求,当定义宏时,其名称与:
?当前定义的其他宏的名称;和
?参数的名称。
它还要求给定宏的参数名彼此不同,但不要求宏参数名在两个不同的宏之间不同
distinct的定义取决于正在使用的C语言的实现和版本:
?在C90中,最低要求是宏标识符的前31个字符是有效的;
?在C99中,最小要求是宏标识符的前63个字符是重要的。
在实践中,实现可能提供更大的限制。该规则要求宏标识符在实现所施加的限制内是不同的
如果两个宏标识符仅在非重要字符上不同,则行为未定义。由于宏参数仅在其宏的扩展期间是活动的,因此不存在一个宏中的参数与另一个宏中的参数相混淆的问题。
如果考虑可移植性,则使用标准中指定的最小限制来应用此规则将是谨慎的。
长宏标识符可能会损害代码的可读性。虽然许多自动代码生成系统会生成较长的宏标识符,但将宏标识符长度保持在远低于此限制的水平是有道理的。
注意:在C99中,如果扩展源字符出现在宏名称中,并且该字符没有相应的通用字符,则标准不会指定它占用多少字符。
无
例1,在下面的示例中,所讨论的实现在宏标识符中支持31个重要的区分大小写的字符
/* 1234567890123456789012345678901********* Characters */
#define engine_exhaust_gas_temperature_raw egt_r
#define engine_exhaust_gas_temperature_scaled egt_s /* Non-compliant */
/* 1234567890123456789012345678901********* Characters */
#define engine_exhaust_gas_temp_raw egt_r
#define engine_exhaust_gas_temp_scaled egt_s /* Compliant */