1
6
(关于这个问题的评论解释了我们所说的
保留标识符
在C99第7.1.3节的意义上,即标识符匹配
它们不是保留在编译器(的任何特定阶段)被期望诊断它们的误用的意义上。相反,它们是保留的,因为如果您愚蠢到自己(错误地)使用它们,那么如果您的程序在以后停止工作或停止编译,您就不必抱怨。 我们都看到过当知识量非常有限的人查看系统标题内部,然后编写自己的标题保护时会发生什么:
他们在调用未定义的行为,但没有什么能将其诊断为 错误:最终用户代码使用了保留标识符 ". 相反,大多数情况下它们是幸运的,而且一切都很好;但是偶尔它们会与实现感兴趣的标识符发生冲突,并且会发生令人困惑的事情。
类似地,我经常有一个名为
根据我对C99的7.1.3、7.26和7.26.11的阅读,这将调用未定义的行为。不过,我决定不关心这个。标识符的保留并不是因为今天会发生任何不好的事情,而是因为标准本身保留了发明新标准的权利
这符合你的4.1,4.2,4.3(如果我理解你的意图在最后一个)。但是,如果
|
2
2
我想,这个故事要比这复杂得多,至少对美国来说是这样
例3。如果是假的
然后,标识符的保留取决于范围。
4.2也不完全正确。首先它只是 未定义的行为 (也称为非常邪恶)在以下条件下定义一个以关键字作为其名称的宏:
然后,在扩展中包含自己名称的宏是“安全的”,因为扩展可以保证不是递归的。以下内容是有效的,但不建议使用:
(顺便说一句,任何人都不要使用这个宏,它编译和执行它的外观,但有一些角的情况下,让它爆炸。) |
3
2
我不知道你所说的“意识”是什么意思,但我认为你不一定能假设这一点-7.1.3说
预处理器(或编译器)实现可以将这些保留标识符用于任何适合它的目的—如果您误用了这些标识符,它不需要警告您。 我建议“当且仅当”标准(例如一组预定义宏)或实现在其文档中这样说时,“程序可以使用保留标识符”。 当然,我认为在相当多的情况下,您可以使用保留的标识符—实现不会特意给您带来问题。很多代码都使用了保留的名称,我猜实现不会在没有足够理由的情况下破坏这些代码。但是,如果您没有实现编译器工具链,最好完全避免使用这个名称空间。 |
4
1
标识符,如
因此,为了诊断这个问题,编译器必须跟踪标识符的来源。仅仅检查没有输入的代码是不够的
|
5
0
如果你问你能不能
|