【问题标题】:Type redefinition of identical definition相同定义的类型重新定义
【发布时间】:2021-02-15 01:03:07
【问题描述】:

如果我想使用一个类型,比如说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;
}

【问题讨论】:

    标签: c++ c typedef redefinition


    【解决方案1】:

    简答

    是的,这是由 C11 及更高版本以及 C++98 及更高版本保证的。

    长答案

    对于 C,C11 标准的第 6.7.3 节规定:

    - 可以重新定义 typedef 名称以表示与当前相同的类型,前提是该类型不是可变修改的类型;

    这意味着只要每个定义相同,就可以重新定义类型。第 6.7.5 节更进一步指出,编译器只会使用这些定义中的第一个(或唯一的定义)。

    对于 C++,C++98 标准的第 7.1.3.3 节规定:

    在给定范围内1typedef 说明符可用于重新定义在该范围内声明的任何类型的名称,以引用它已经引用的类型。

    这意味着在任何非类范围内都允许重新定义类型。此外,在第 7.1.3.6 节中,它指出:

    在给定范围内,typedef 说明符不得用于重新定义在该范围内声明的任何类型的名称以引用不同的类型。

    这意味着当定义(type,在文档中)更改时,不允许重新定义。因此,我们无法重新定义类型的唯一情况是后续定义与第一个定义不同,或者 - 如第 7.1.3.8 节所述 - 如果类型名称描述了以下任何内容:

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

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

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

    【讨论】:

    • @eerorika 好点。我将详细说明我的资料来源并添加 C++ 标准对该主题的规定。
    • 请注意,这是在 C11 中添加到 ISO C 中的,因此可能会被旧编译器(或旧版本兼容模式下的新编译器)拒绝
    • @M.M 谢谢你的建议。当每个标准开始指定类型重新定义时,我已经添加了。
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多