c++ - C++ 翻译单元的语法

标签 c++ grammar declaration

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

许多人对这一说法提出异议,但从来没有人给出过反例。但我自己发现了这个困扰我的例子:

int x;       //declaration

;            // ??? EMPTY DECLARATION?

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

这可以很好地与 MSVC 和在线 comeau 一起编译。我知道该标准定义了一个空声明,但我从未听说过空声明。所以,我看到三个选项:

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

请帮我解开疑惑。谢谢

最佳答案

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

编辑:这个答案似乎是错误的(标准上有一个语义规则 - 但据我所知,这本书上没有 - 禁止 decl-specified- seqinit-declarator-list 同时为空)。请参阅查尔斯贝利的回答。


n“C++ 编程语言”,附录 A,A.4 节:

A program is a collection of translation-units (...). A translation-unit, often called a source file, is a sequence of declarations:

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-seqinit-declarator-list 非文字都是可选的,; 是一个有效的声明。

关于c++ - C++ 翻译单元的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335024/

相关文章:

.net - 在循环内或循环外声明变量更快?

C++ 在头文件中声明实例变量并在源文件中调用构造函数

c++ - 有人知道 char a [' ' ] 吗?

c++ - 检查是否存在嵌套类型别名并有条件地设置类型别名

c++ - setShortcut 的多个键盘快捷键

lisp - 如何使用 Lisp 表达 BNF?

AntLR4:为 Dockerfile 编写语法

java - 查找下一个预期 token 如果发生错误 ANTLR 3

c++ - 使用 std::enable_if 作为模板时的默认模板参数。 param.: 为什么可以使用两个仅在 enable_if 参数上不同的模板函数?

c# - 我的 C++ 和 C# 互操作在 64 位中崩溃,为什么?指针大小?