相同定义的类型重新定义
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 节规定:
- a typedef
name may be redefined to denote the same type as it currently does,provided that type is not a variably modified type;
这意味着可以重新定义一个类型,只要每个定义都相同即可。第 6.7.5 节更进一步指出编译器只会使用这些定义中的第一个(或唯一的定义)。
对于 C++,C++98 标准的第 7.1.3.3 节指出:
In a given scope1, a typedef
specifier can be used to redefine the name of any type declared in that scope to refer to the type to which it already refers.
这意味着在任何非class范围内都允许类型重定义。此外,在第 7.1.3.6 节中,它指出:
In a given scope, a typedef
specifier shall not be used to redefine the name of any type declared in that scope to refer to a different type.
这意味着当定义(type,在文档中)改变时,不允许重新定义。因此,我们无法重新定义类型的唯一情况是后续定义与第一个定义不同,或者——如第 7.1.3.8 节所述——如果类型名称描述了以下任何内容:
- 详细的类型说明符
- 一个class定义
- 构造函数声明,或
- 析构函数声明
来源: https://port70.net/~nsz/c/
1在 C++03 及更高版本中,范围必须是非 class
如果我想使用一个类型,比如说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 节规定:
- a
typedef
name may be redefined to denote the same type as it currently does,provided that type is not a variably modified type;
这意味着可以重新定义一个类型,只要每个定义都相同即可。第 6.7.5 节更进一步指出编译器只会使用这些定义中的第一个(或唯一的定义)。
对于 C++,C++98 标准的第 7.1.3.3 节指出:
In a given scope1, a
typedef
specifier can be used to redefine the name of any type declared in that scope to refer to the type to which it already refers.
这意味着在任何非class范围内都允许类型重定义。此外,在第 7.1.3.6 节中,它指出:
In a given scope, a
typedef
specifier shall not be used to redefine the name of any type declared in that scope to refer to a different type.
这意味着当定义(type,在文档中)改变时,不允许重新定义。因此,我们无法重新定义类型的唯一情况是后续定义与第一个定义不同,或者——如第 7.1.3.8 节所述——如果类型名称描述了以下任何内容:
- 详细的类型说明符
- 一个class定义
- 构造函数声明,或
- 析构函数声明
来源: https://port70.net/~nsz/c/
1在 C++03 及更高版本中,范围必须是非 class