我的理解,很长一段时间以来,一个C ++翻译单元,在预处理器运行之后,是一系列声明(让我提醒任何定义也是一个声明)。
许多人都赞同这一说法,但没有人给出反例。但是我自己发现了这个困扰我的例子:
int x; //declaration
; // ??? EMPTY DECLARATION?
int main() //dec
{ //la
} //ration
这适用于MSVC和在线漫画。我知道标准定义了 空语句 ,但我从来没有听说过空声明。所以,我看到三个选项:
请帮助我解除我的疑虑。谢谢
答案 0 :(得分:6)
您的理解是正确的,标准(或至少是Stroustrup)确实定义了一个空声明。
编辑:似乎这个答案是错误的(标准上有一个语义规则 - 但据我所知,这本书并没有禁止decl-specified-seq
和{{}}同时为空的{1}}。请参阅Charles Bailey的回答。
n“C ++编程语言”,附录A,A.4节:
程序是
init-declarator-list
s(...)的集合。translation-unit
,通常称为源文件,是translation-unit
s的序列:
declaration
translation-unit:
declaration-seq_opt
表示制作是可选的。在此规则中,这意味着空翻译单元有效。
第A.7节:
opt
因此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
非文字都是可选的,;
是有效的声明。
答案 1 :(得分:5)
在文件范围(和命名空间范围以及允许声明的其他位置)的C ++ 0x的(当前草案)中允许 empty-declaration ,它只是一个分号。它是一个独立的语法实体。
在C ++ 03中,如果只需要声明,则不允许使用单独的分号。虽然可能看起来简单声明可能只能缩减为分号,但显式规则不允许这样做。
7 [dcl.dcl] / 3
在简单声明中,只有在声明类(第9节)或枚举(7.2)时,即 decl时,才能省略可选的 init-declarator-list -specifier-seq 包含类说明符,详细说明类型说明符,带有类密钥(9.1)或枚举说明符。
简而言之,这意味着只有在不省略 decl-specifier-seq 时才能省略 init-declarator-list 。