C与C ++中的struct和typedef

我目前正在使用C ++ IDE来处理需要在C上工作的东西,并希望确保稍后我不会遇到问题。 在制作下面的结构后:

typedef struct test { int a; int b; }; 

然后我使用test my_test;创建它的一个实例test my_test; 那么像my_test.a = 5类的东西……这在我的VStudio C ++中运行良好。 这会在以后的gcc上运行吗?

我读了相关的问题(我看到我不是第一个有这种问题的人),但似乎没有人像我这样做。

实际上, typedef struct {//stuff} test;之间有什么区别typedef struct {//stuff} test; 和我的版本?

和…之间的不同:

 struct Name {}; 

 typedef struct Name {} Name; 

是这样,在C中,你需要使用:

 struct Name instance_name; 

对于前者,对于后者,您可以:

 Name instance_name; 

在C ++中,在任何一种情况下都没有必要重复struct关键字。 请注意,您创建没有名称的typedef(即typedef struct Name{}; )的typedef struct Name{};是非标准AFAIK(如果使用关键字typedef ,则需要提供一个别名以键入该名称)。

至于最后的变化:

 typedef struct { /* ... */ } Name; 

上面的代码创建了一个名为struct的未命名结构。 你可以像使用typedef struct Name { /* ... */ } Name;一样使用这样的结构typedef struct Name { /* ... */ } Name; 但是编译器通常会发出结构的名称(而不是别名),因此如果你给它一个名字和typedef而不是typedef的匿名结构,你可能会得到更好的涉及结构的错误消息。

 typedef struct THIS_IS_A_TAG { int a; int b; } THIS_IS_A_TYPEDEF; THIS_IS_A_TYPEDEF object1; // declare an object. C:Ok, C++:Ok struct THIS_IS_A_TAG object2; // declare another object. C:Ok, C++:Ok THIS_IS_A_TAG object3; // declare another object. C:Not Ok, C++:Ok 

typedef的原因是因为C程序员希望能够做到第三件事,但他们不能。

在C和C ++中,示例构造都是毫无意义的:

 typedef struct test { int a; int b; }; 

在C中,这表示存在一个类型struct test ,其中两个整数作为内容。 如果在大括号’ } ‘和分号’之间有一个名字; ‘,那么你会从关键字typedef获得一些好处; 就目前而言,关键字typedef是多余的,并且(如果设置得足够繁琐),GCC会警告你。

在C ++中,这表示存在类型struct test ; 此外,在C ++中,它也创建了一个类型test (在C中不会发生)。 关键字typedef仍然可以省略,并且将实现相同的结果。

语法合法; 它没用,就是这样。 关键字typedef可以在不改变程序含义的情况下省略。

你可以做:

 typedef struct test { int a; int b; } test; 

现在,在C和C ++中,您都有一个类型struct test和一个别名test