gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:58:49 32 4
gpt4 key购买 nike

我读到在 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 方 header 的定义的问题。

最佳答案

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

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
$

关于c - typedef 重定义如何在 C11 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67929089/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com