Lint限制宏名称列表

时间:2013-08-20 23:32:52

标签: lint

我遇到了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中禁止显示宏名称的正式列表?

1 个答案:

答案 0 :(得分:2)

您可能正在使用保留给实现的_HEADER_FILE_H_等宏名称,而PC Lint会告诉您此错误。

删除水平滚动条后,您误用的名称似乎是defined。 C预处理器使用名称defined

#if defined(SOME_MACRO)

因此,你不能写:

#define defined(x)   ((x) != 0)

或类似的东西。您应该将defined视为关键字,至少在预处理器指令中是这样(并且您不能将其视为预处理器指令之外的宏)。虽然您可以将其用作变量名称(并且您也可以使用endifdefine以及elif作为变量名称),但最好不要使用它并将它们视为变量名称保留字。


C11标准(ISO / IEC 9899:2011)说:

  

7.1.3保留标识符

     

¶1每个标头声明或定义其相关子条款中列出的所有标识符,和   可选地声明或定义其关联的未来库方向中列出的标识符   子条款和标识符,它们总是保留用于任何用途或用作文件   范围标识符。

     
      
  • 所有以下划线和大写字母或其他字母开头的标识符   下划线总是保留用于任何用途。
  •   
  • 所有以下划线开头的标识符始终保留用作标识符   在普通名称和标签名称空间中都有文件范围。
  •   
  • 以下任何子条款中的每个宏名称(包括将来的库)   如果包含任何相关标题,则保留指定用途;   除非另有明确说明(见7.1.4)。
  •   
  • 以下任何子条款中包含外部链接的所有标识符(包括   未来的图书馆方向)和errno总是保留用作标识符   外部联系。 184)
  •   
  • 具有文件范围的每个标识符在以下任何子条款中列出(包括   未来的图书馆方向)保留用作宏名称和标识符   如果包含任何相关标头,则文件范围在同一名称空间中。
  •   
     

¶2没有保留其他标识符。如果程序声明或定义了一个标识符   保留的上下文(7.1.4允许的除外),或定义保留的上下文   标识符作为宏名称,行为未定义。

     

¶3如果程序删除(使用#undef)第一个标识符的任何宏定义   上面列出的组,行为未定义。

     

184)包含外部链接的保留标识符列表包括math_errhandlingsetjmpva_copyva_end

该标准的先前版本对等效限制使用非常相似的措辞。