繁体   English   中英

相同定义的类型重新定义

[英]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 节所述 - 如果类型名称描述了以下任何内容:

  • 详细的类型说明符
  • 一个 class 定义
  • 构造函数声明,或
  • 析构函数声明

来源: https://port70.net/~nsz/c/

1在 C++03 及更高版本中,scope 必须是非类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM