gpt4 book ai didi

c++ - 常量类型定义;在 C 和 C++ 中

转载 作者:IT老高 更新时间:2023-10-28 23:18:25 25 4
gpt4 key购买 nike

在 C 和 C++ 中允许以下语句的最初原因是什么?

const typedef;

这似乎没有任何实际意义。

此外,您可以这样做:const;typedef;

编辑:@AndreyT 指出这不是标准定义的行为。对于完整的答案,我想知道 GCC 开发人员在决定这种类型的代码应该是可编译的时出现的任何可能的优势。

最佳答案

这看起来像是一种退化的声明形式。

在 C 中声明不是语句。这是一个声明。而且你上面的东西是不允许的。

6.7 Declarations

2 A declaration shall declare at least a declarator (other than theparameters of a function or the members of a structure or union), atag, or the members of an enumeration.

在 C++ 中声明是一个语句。但是仍然不允许您使用上面的内容。来自 C++03

7 Declarations

3 In a simple-declaration, the optional init-declarator-list can beomitted only when declaring a class (clause 9) or enumeration (7.2),that is, when the decl-specifier-seq contains either aclass-specifier, an elaborated type-specifier with a class-key (9.1),or an enum-specifier.

如果某些编译器在 C 或 C++ 代码中允许这样做,那一定是该编译器的怪癖。你应该把这个问题直接问它的作者。

您可能知道,C 和 C++ 的语法并不仅仅由语法指定。仅通过语法来做到这一点太复杂或完全不可能。伴随语法的文本施加了一些额外的限制。编译器通常会尊重语法本身,但是当涉及到那些精心设计的附加限制时......许多编译器允许一些违规行为溜走。

我会做出有根据的猜测,这一定是“空声明”扩展的副作用。从一开始,空声明在 C 和 C++ 中就是非法的。比如这段代码一直是非法的

void foo() {}; // In file scope

因为它遵循带有空声明的函数定义。然而,几乎所有编译器都接受它,允许空声明作为扩展。出于同样的原因,您可以编写

;;;; // In file scope

在文件中间并编译您的代码。您在示例中拥有的也是一个空声明,其中添加了一些无关紧要的限定符和存储类说明符。

附:如果我错了,请纠正我,但 C++11 使空声明合法化。我不确定 C11。

关于c++ - 常量类型定义;在 C 和 C++ 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17634243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com