很长一段时间以来,我的理解是一个 C++ 翻译单元,在预处理器运行之后,是一系列声明(让我提醒一下,任何定义也是声明)。
许多人对这一说法提出异议,但从来没有人给出过反例。但我自己发现了这个困扰我的例子:
int x; //declaration
; // ??? EMPTY DECLARATION?
int main() //dec
{ //la
} //ration
这可以很好地与 MSVC 和在线 comeau 一起编译。我知道该标准定义了一个空声明,但我从未听说过空声明。所以,我看到三个选项:
- 我的理解是正确的,标准定义了空声明
- 我的理解是正确的,但是标准没有定义空声明并且上面的翻译格式不正确
- 我的理解不正确,即 C++ TU 不是一系列声明
请帮我解开疑惑。谢谢
最佳答案
您的理解是正确的,标准(或至少 Stroustrup)确实定义了一个空声明。
编辑:这个答案似乎是错误的(标准上有一个语义规则 - 但据我所知,这本书上没有 - 禁止 decl-specified- seq
和 init-declarator-list
同时为空)。请参阅查尔斯贝利的回答。
n“C++ 编程语言”,附录 A,A.4 节:
A program is a collection of
translation-unit
s (...). Atranslation-unit
, often called a source file, is a sequence ofdeclaration
s:
translation-unit:
declaration-seq_opt
opt
表示生产是可选的。在此规则中,意味着一个空的翻译单元是有效的。
A.7 节:
declaration-seq:
declaration
declaration-seq declaration
declaration:
block-declaration
(...)
block-declaration:
simple-declaration
(...)
simple-declaration:
decl-specified-seq_opt init-declarator-list_opt ;
所以 declaration-seq
是至少一个 declaration
的序列。一个 declaration
可以是一个 block-declaration
,它又会产生 simple-declaration
。由于 decl-specified-seq
和 init-declarator-list
非文字都是可选的,;
是一个有效的声明。
关于c++ - C++ 翻译单元的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335024/