以下代码编译并运行良好:
#include <stdio.h>
typedef int Someint;
typedef int Someint;
int main()
{
Someint b = 4;
printf("%d", b);
return 0;
}
以下代码无法编译。它给了我一个错误conflicting types for 'Somestruct'
。
#include <stdio.h>
typedef struct
{
int x;
}
Somestruct;
typedef struct
{
int x;
}
Somestruct;
int main()
{
Somestruct b;
b.x = 4;
printf("%d", b.x);
return 0;
}
为什么我可以typedef
一个type
(第一个代码中为int
)两次而不会出现错误,但同样的事情会因另一个type
而失败(上面的结构)?这两种情况有什么区别?
我正在使用CodeBlocks 12.11附带的MinGW编译器。
答案 0 :(得分:6)
当你这样做时,事情就是:
typedef struct
{
} Somestruct;
它创建了一个匿名结构 - 您可以期望使用一些隐藏的实现定义的保证唯一占位符标识符 - 您为其指定了typedef。因此,当您执行两次时,您会遇到相同类型的名称要求引用两个不同结构的冲突。使用int
,您只需重复原始内容即可。如果为结构提供实际名称,那么可以重复使用typedef:
typedef struct Somestruct
{
} Somestruct;
答案 1 :(得分:5)
因为您使用匿名结构定义了typedef,所以两个定义都是不同的。
以下不会这样做,并且有效。 (请注意,您仍然只能定义struct
一次)
#include <stdio.h>
typedef struct foo
{
int x;
}
Somestruct;
typedef struct foo Somestruct;