我遇到了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中禁止显示宏名称的正式列表?
答案 0 :(得分:2)
您可能正在使用保留给实现的_HEADER_FILE_H_
等宏名称,而PC Lint会告诉您此错误。
删除水平滚动条后,您误用的名称似乎是defined
。 C预处理器使用名称defined
:
#if defined(SOME_MACRO)
因此,你不能写:
#define defined(x) ((x) != 0)
或类似的东西。您应该将defined
视为关键字,至少在预处理器指令中是这样(并且您不能将其视为预处理器指令之外的宏)。虽然您可以将其用作变量名称(并且您也可以使用endif
和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
。
该标准的先前版本对等效限制使用非常相似的措辞。