我想要一个标准参考,为什么以下代码会触发 C 中的合规性警告(使用gcc -pedantic
; “typedef 重新定义”),但在 C++ 中没问题(g++ -pedantic
):
typedef struct Foo Foo;
typedef struct Foo Foo;
int main() { return 0; }
为什么我不能定义一个typedef
在C中反复?
(这对于 a 的标头结构具有实际意义.)
为什么它能在 C++ 中编译?
因为 C++ 标准明确这么说。
参考:
C++03 标准 7.1.3 typedef 说明符
§7.1.3.2:
在给定的非类作用域中,typedef 说明符可用于重新定义在该作用域中声明的任何类型的名称,以引用它已引用的类型。
[例子:
typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;
—结束示例]
为什么在 C 语言中编译失败?
typedef
名称没有链接,并且 C99 标准不允许没有链接规范的标识符在相同范围和相同名称空间中具有多个声明。
参考:
C99 标准:§6.2.2 标识符的链接
§6.2.2/6 states:
以下标识符没有链接:声明为除以下内容之外的任何标识符
一个对象或一个函数;声明为函数参数的标识符;块作用域
未使用存储类说明符声明的对象的标识符。
Further §6.7/3 states:
如果标识符没有链接,则在相同范围和相同命名空间中不得有超过一个标识符声明(在声明符或类型说明符中),但 6.7.2.3 中指定的标签除外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)