微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

typedef 重定义如何在 C11 中工作?

如何解决typedef 重定义如何在 C11 中工作?

我读到在 C11 中允许重新定义 typedef,只要定义相同。但是下面的代码

typedef struct {
    int x;
} a_t;

typedef struct {
    int x;
} a_t;

int main(int argc,char* argv[]) {
    a_t a;
    return a.x + argc;
}

当用 C11 标志编译时给我一个重新定义错误

% clang -std=c11 -o x x.c
x.c:7:3: error: typedef redeFinition with different types ('struct a_t' vs 'struct a_t')
} a_t;
  ^
x.c:3:3: note: prevIoUs deFinition is here
} a_t;
  ^
1 error generated.

有趣的是,如果 typedef 只是一个原始类型(即“typedef int a_t;”),那么即使没有“-std=c11”标志,重定义也不会抛出错误

为什么不能重新定义带有结构的类型?

这是来自 3rd 方标头的定义的问题。

解决方法

这两个结构体虽然具有相同的字段,但它们的类型并不相同。使用命名结构可以更清楚地看到这一点:

struct first {
    int x;
};

struct second {
    int x;
};

显然这是两个不同的结构体,尽管它们具有相同的字段。

因此,在您的情况下,可以定义单个命名结构,然后 typedef 重新定义将起作用。

$ cat test.c
struct A {
    int x;
};

typedef struct A a_t;
typedef struct A a_t;

int main(void)
{

}

$ clang -std=c99 test.c
test.c:6:18: warning: redefinition of typedef 'a_t' is a C11 feature
      [-Wtypedef-redefinition]
typedef struct A a_t;
                 ^
test.c:5:18: note: previous definition is here
typedef struct A a_t;
                 ^
1 warning generated.

$ clang -std=c11 test.c
$ 
,

在这些声明中

typedef struct {
    int x;
} a_t;

typedef struct {
    int x;
} a_t;

使用了两种未命名的结构,它们被视为两种不同的类型。

所以别名 a_t 是为两种不同的类型定义的。

如果假设 typedef 使用相同的类型,那么无论如何都会重新定义未命名结构,即它被定义了两次。

也就是说,如果你会写例子

struct A
{
    int x;
};

struct A
{
    int x;
};

然后编译器也会发出类似的错误信息,在这种情况下结构A被重新定义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。