![](/img/trans.png)
[英]Compile error “'struct' type redefinition” although it's the first definition for it
[英]Type redefinition of identical definition
如果我想使用一个类型,比如说ulong
(POSIX 的一部分),但不知道它是否已经定义,是否保证使用相同定义的重新定义是良性的? 这适用于 GCC,但我不确定它是否在 C 标准中定义。
例子
#include <stdio.h>
#include <sys/types.h> // POSIX
/* 'ulong' already defined as 'unsigned long' */
typedef unsigned long ulong; // (Benign?) redefinition
int main(void) {
ulong n = 5;
printf("Result: %ld\n", n);
return 0;
}
是的,C11 及更高版本以及 C++98 及更高版本保证了这一点。
对于 C,C11 标准的第 6.7.3 节规定:
- 可以重新定义
typedef
名称以表示与当前相同的类型,前提是该类型不是可变修改的类型;
这意味着只要每个定义相同,就可以重新定义类型。 第 6.7.5 节更深入到 state,编译器将只使用这些定义中的第一个(或唯一的定义)。
对于 C++,C++98 标准的第 7.1.3.3 节规定:
在给定的 scope 1中,
typedef
说明符可用于重新定义在 scope 中声明的任何类型的名称,以引用它已经引用的类型。
这意味着在任何非类 scope 中都允许重新定义类型。 此外,在第 7.1.3.6 节中,它指出:
在给定的 scope 中,不应使用
typedef
说明符来重新定义在 scope 中声明的任何类型的名称以引用不同的类型。
这意味着当定义(文档中的type )更改时,不允许重新定义。 因此,我们无法重新定义类型的唯一情况是后续定义与第一个定义不同,或者 - 如第 7.1.3.8 节所述 - 如果类型名称描述了以下任何内容:
来源: https://port70.net/~nsz/c/
1在 C++03 及更高版本中,scope 必须是非类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.