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

C+的语法+;翻译单位 我的理解是,很长时间以来,C++处理器在预处理器运行之后是一系列声明(让我提醒一下,任何定义也是一个声明)。,c++,grammar,declaration,C++,Grammar,Declaration,许多人对这一说法进行了辩论,但从来没有人给出反例。但我自己发现了一个困扰我的例子: int x; //declaration ; // ??? EMPTY DECLARATION? int main() //dec { //la } //ration 这可以通过MSVC和在线comeau很好地编译。我知道标准定义了一个空语句,但我从来没有听说过空声明。因此,我看到三种选择: 我的理解是正确的,标准定义了一个

许多人对这一说法进行了辩论,但从来没有人给出反例。但我自己发现了一个困扰我的例子:

int x;       //declaration

;            // ??? EMPTY DECLARATION?

int main()   //dec
{            //la
}            //ration
这可以通过MSVC和在线comeau很好地编译。我知道标准定义了一个空语句,但我从来没有听说过空声明。因此,我看到三种选择:

  • 我的理解是正确的,标准定义了一个空声明
  • 我的理解是正确的,但是标准没有定义空声明,并且上面的翻译格式不正确
  • 我的理解是错误的,即C++ TU不是声明序列< /LI>
请帮我消除疑虑。谢谢

您的理解是正确的,标准(或至少Stroustrup)确实定义了一个空声明

EDIT:这个答案似乎是错误的(标准上有一条语义规则,但据我所知,这本书上没有,它禁止
decl指定的seq
init声明器列表
同时为空)。见查尔斯·贝利的答案


n“C++程序设计语言”,附录A,A.4:4/< 程序是翻译单元(…)的集合。通常称为源文件的

翻译单元是一系列
声明

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
是至少一个
声明的序列。一个
声明
可以是一个
块声明
,它反过来产生
简单声明
。由于
decl指定的seq
init声明符列表
非文本都是可选的,
是一个有效的声明。

在C++0x的(当前草稿)中,文件范围(以及命名空间范围和允许声明的其他位置)允许使用空声明,它只是一个分号。它是一个独立的语法实体

在C++03中,如果只需要声明,则不允许使用单独的分号。虽然一个简单的声明似乎可以简化为一个分号,但显式规则不允许这样做

7[dcl.dcl]/3

在简单声明中,只有在声明类(第9条)或枚举(7.2)时,也就是说,当decl说明符seq包含类说明符、带类键的详细类型说明符(9.1)或枚举说明符时,才可以省略可选的init说明符列表


简而言之,这意味着只有当decl说明符seq没有被省略时,init声明符列表才能被省略。

我没有标准的副本,所以Stroustrup是我能做到的。不正确,请参见[dcl.dcl]/3。“在简单声明中,只有在声明类或枚举时,才可以省略可选的init声明器列表…”在这种情况下,decl说明符seq不能为空。这在C++0x中仍然是正确的,但在C++0x中有一个额外的显式空声明,因此一个单独的分号是有效的。因此,我的声明在C++0x中是正确的,但在C++03中是不正确的,是吗?或者更确切地说,我的声明在这两方面都是正确的,但在C++03中,我的示例格式不正确?“你在暗示哪一个?”Armen Tsirunyan:根据我的解释,是的,但是就像C++中的所有东西一样,我在等待被纠正;抱歉,我编辑了我的评论,它现在询问A或B,所以“是”不是有效的答案:)为了清楚起见,您编辑了您的评论:您的示例格式错误,因为它违反了C++03的可诊断语义规则。但是,它是/将是格式良好的C++0x。。隐马尔可夫模型。。这似乎有道理。但事实上你是对的,这是C++,没有什么是足够清楚的。所以,让我们拭目以待,看看是否有人用另一句有用的话来纠正你:)。如果没有,我一定会接受你的回答
declaration-seq:
    declaration
    declaration-seq declaration

declaration:
    block-declaration
    (...)

block-declaration:
    simple-declaration
    (...)

simple-declaration:
    decl-specified-seq_opt init-declarator-list_opt ;