我遇到了 PC-Lint 错误消息 (e136):
Illegal macro name -- The ANSI standard restricts the use of certain names as
macros. defined is on the restricted list.
我在 ANSI C 规范中找不到对此类列表的任何引用。这个列表是由 PC-Lint 自己维护的,还是有 ANSI C 中禁止的宏名称的官方列表?
我遇到了 PC-Lint 错误消息 (e136):
Illegal macro name -- The ANSI standard restricts the use of certain names as
macros. defined is on the restricted list.
我在 ANSI C 规范中找不到对此类列表的任何引用。这个列表是由 PC-Lint 自己维护的,还是有 ANSI C 中禁止的宏名称的官方列表?
您可能正在使用宏名称,例如_HEADER_FILE_H_
保留给实现的宏名称,而 PC Lint 会告诉您此错误。
删除水平滚动条后,您误用的名称似乎是defined
. C 预处理器使用该名称defined
:
#if defined(SOME_MACRO)
因此,您不能写:
#define defined(x) ((x) != 0)
或任何类似的东西。您应该defined
至少在预处理器指令中将其视为关键字(并且您不能将其视为预处理器指令之外的宏)。尽管您可以将它用作变量名(您也可以将andendif
用作变量名),但最好不要使用它并将它们视为保留字。define
elif
C11 标准 (ISO/IEC 9899:2011) 说:
7.1.3 保留标识符
¶1 每个标头声明或定义其相关子条款中列出的所有标识符,并可选地声明或定义其相关未来库方向子条款中列出的标识符和标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。
- 以下划线和大写字母或另一个下划线开头的所有标识符始终保留用于任何用途。
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
- 如果包含任何关联的头文件,则以下任何子条款(包括未来的库方向)中的每个宏名称都保留用于指定使用;除非另有明确说明(见 7.1.4)。
- 以下任何子条款(包括未来的库方向)和 errno 中的所有具有外部链接的标识符始终保留用作具有外部链接的标识符。184)
- 如果包含任何关联的标头,则保留在以下任何子条款(包括未来的库方向)中列出的具有文件范围的每个标识符用作宏名称和具有相同名称空间中的文件范围的标识符。
¶2没有保留其他标识符。如果程序在保留标识符的上下文中声明或定义标识符(7.1.4 允许的除外),或将保留标识符定义为宏名称,则行为未定义。
¶3 如果程序删除(使用
#undef
)上面列出的第一组中标识符的任何宏定义,则行为未定义。184)具有外部链接的保留标识符列表包括
math_errhandling
、setjmp
、va_copy
和va_end
。
该标准的先前版本对等效的一组限制使用了非常相似的措辞。