C ++翻译单元的语法

时间:2010-12-02 12:35:31

标签: c++ grammar declaration

我的理解,很长一段时间以来,一个C ++翻译单元,在预处理器运行之后,是一系列声明(让我提醒任何定义也是一个声明)。

许多人都赞同这一说法,但没有人给出反例。但是我自己发现了这个困扰我的例子:

int x;       //declaration

;            // ??? EMPTY DECLARATION?

int main()   //dec
{            //la
}            //ration

这适用于MSVC和在线漫画。我知道标准定义了 空语句 ,但我从来没有听说过空声明。所以,我看到三个选项:

  • 我的理解是正确的,标准定义了一个空声明
  • 我的理解是正确的,但标准没有定义空声明,上面的翻译是不正确的
  • 我的理解不正确,即C ++ TU不是声明序列

请帮助我解除我的疑虑。谢谢

2 个答案:

答案 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-seqinit-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