【问题标题】:What #define identifiers are reserved to the preprocessor?哪些#define 标识符保留给预处理器?
【发布时间】:2014-02-25 22:04:30
【问题描述】:

我以为我曾经读过 #define 值中的前导下划线,例如;

#define _FOO

被 ANSI C 或其他一些标准劝阻或禁止。今天我浏览了 Internet,查看了 K&R 和 CRM,但找不到任何支持它的东西。我发现的最接近的是一个建议(没有合适的引用),预定义的标识符总是以 开头,以双下划线结尾,这样上面就不会发生冲突。我问是因为我正在使用一个抱怨的新静态检查器:

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

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

【问题讨论】:

  • “今天我浏览了互联网,查看了 K&R 和 CRM,但找不到任何支持它的东西” - 嗯……您尝试过标准吗?
  • 是的,那个。 :) 该标准基本上是您能找到的最权威的文档:什么是格式正确的 C 代码,什么不是格式正确的 C 代码。
  • 我没有印刷版,也没有在网上找到。可能我的搜索词很弱。不过,我会发誓“C 标准”或“ANSI C”或“C99”在那里。

标签: c c-preprocessor


【解决方案1】:

今天我浏览了互联网,查看了 K&R 和 CRM,但找不到任何支持它的东西。

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

现在关于 K&R 书第 2 版,它是这样写的:

(K&R 第 2 版,2.1)“但是,不要以下划线开头变量名,因为库例程经常使用这样的名称。”

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多