(对问题的评论解释说,我们正在讨论C99 第 7.1.3 节意义上的保留标识符,即在文件范围内与外部链接等/^_[A-Z_]/
任何地方匹配的标识符。所以这是我的猜测至少一部分你在问什么......)/^_/
/^str[a-z]/
从某种意义上说,它们不是保留的(任何特定阶段)编译器应该诊断它们的误用。相反,它们是保留的,因为如果您愚蠢到自己(误用)它们,那么如果您的程序停止工作或在以后停止编译,您就不会抱怨。
我们都看到了当只有少量知识的人查看系统头文件然后编写自己的头文件保护时会发生什么:
#ifndef _MYHEADER_H
#define _MYHEADER_H
// ...
#endif
他们正在调用未定义的行为,但没有将其诊断为“错误:最终用户代码使用的保留标识符”。相反,大多数情况下他们很幸运,一切都很好。但有时它们会与实现感兴趣的标识符发生冲突,并且会发生令人困惑的事情。
strip()
同样,我经常有一个名为左右的外部可见函数:
char *strip(char *s) {
// remove leading whitespace
}
通过阅读 C99 的 7.1.3、7.26 和 7.26.11,这会引发未定义的行为。但是我决定不关心这个。标识符的保留不是因为预计今天会发生任何不好的事情,而是因为标准保留了str-ip()
在未来修订中发明新标准例程的权利。而且我已经决定我认为string - ip
,无论它可能是什么,都不太可能是将来添加的字符串操作的名称——所以万一发生这种情况,我会在到达时越过那座桥它。从技术上讲,我正在调用未定义的行为,但我不希望被咬。
最后,针对您的第 4 点举一个反例:
#include <string.h>
#define memcpy(d,s,n) (my_crazy_function((n), (s)))
void foo(char *a, char *b) {
memcpy(a, b, 5); // intends to invoke my_crazy_function
memmove(a, b, 5); // standard behaviour expected
}
这符合您的 4.1、4.2、4.3(如果我理解您对最后一个的意图)。但是,如果memmove
另外实现为用 编写的宏(通过 7.1.4/1)memcpy
,那么您将遇到麻烦。