C89, 4.1.2 标准标题(已添加重点):
保留以下划线开头的所有外部标识符。
C99(及更高版本),7.1.3 保留标识符,1(强调添加):
所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
C 的基本原理,7.1.3 保留标识符,25(强调添加):
同样为实现者保留的是以下划线开头的所有外部标识符,以及以下划线开头的所有其他标识符,后跟大写字母或下划线。
因此,根据 C99(及更高版本),在:
typedef int _t; // non-reserved in C89, reserved in C99 (and later)
static int _f(int x); // non-reserved in C89, reserved in C99 (and later)
(在文件范围内声明)_t
and_f
是保留的,这与 Rationale 和 C89 相矛盾。
这是否意味着 C99(及更高版本)在 7.1.3 保留标识符中遗漏了“外部”:“所有外部标识符……”?
UPD。桌子:
is _x reserved ?
C89 C99 (and later)
scope - linkage
function - external n/a n/a
function - internal n/a n/a
function - none no no
file - external yes yes**
file - internal no yes**
file - none no yes**
block - external yes no*
block - internal n/a n/a
block - none no no
function prototype - external n/a n/a
function prototype - internal n/a n/a
function prototype - none no no
其中*
是一个可能的缺陷,见下文,并且**
是“在普通和标记名称空间中”(C11,7.1.3 保留标识符,1)。
在这里,我们看到 C99(及更高版本)保留更多(如果表格正确)。额外:为了什么目的?