预处理器保留了哪些#define标识符?

时间:2014-02-25 22:04:31

标签: c c-preprocessor

我以为我曾经读过一个#define值的前导下划线,如<; p>

#define _FOO
ANSI C或其他标准不鼓励或禁止

。今天我已经梳理了互联网,审查了K&amp; R和CRM,但却无法找到支持它的东西。我发现的最接近的建议是(没有合适的引用)预定义标识符始终以开始以双下划线结束,以便上述内容不会发生冲突。我问,因为我正在使用一个抱怨的新静态检查器:

#ifndef __FOO_H
#define __FOO_H
...
#endif // __FOO_H

#define行,我无法找到权威的答案,无论我是对还是检查员。

1 个答案:

答案 0 :(得分:7)

今天我已经梳理了互联网,审查了K&amp; R和CRM,找不到任何支持它的东西。

  

(C99,7.1.3.p1)“所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途。”

现在关于K&amp; R第2版的书写:

  

(K&amp; R 2nd edition,2.1)“不要用下划线开始变量名,但是,因为库例程经常使用这样的名称。”

如果CRM实际上是指CARM(Harbison&amp; Steele的C参考手册):

  

(CARM第5版,10.1.1保留库标识符):“为C实现保留的标识符包括:[...]用于宏,关键字或全局       变量,以_开头的标识符和第二个_或者       大写字母(_ _ STDC _...除外)“