2

以下代码编译并运行良好:

#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 一次typeint在第一个代码中)两次没有错误,但同样的事情对另一个失败type(上面的结构)?这两种情况有什么区别?我正在使用 CodeBlocks 12.11 附带的 MinGW 编译器。

4

2 回答 2

6

问题是当你这样做时:

typedef struct
{

} Somestruct;

它创建了一个匿名结构 - 您可以期望使用一些隐藏的实现定义的保证唯一占位符标识符 - 您为其指定 typedef。因此,当您这样做两次时,您会遇到冲突,因为要求使用相同的 typedef 名称来引用两个不同的结构。使用int,您只是在重复原始内容。如果你给结构一个实际的名字,那么你就可以重复 typedef:

typedef struct Somestruct
{

} Somestruct;
于 2013-05-07T09:05:08.060 回答
5

因为您使用匿名结构定义 typedef,所以两个定义是不同的。

以下不这样做,并且有效。(请注意,您仍然只能定义struct一次)

#include <stdio.h>

typedef struct foo
{
    int x;
}
Somestruct;

typedef struct foo Somestruct;
于 2013-05-07T09:06:08.877 回答