C与C++中的struct和typedef

use*_*875 8 c c++ struct typedef

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

typedef struct test {
   int a;
   int b;
};
Run Code Online (Sandbox Code Playgroud)

然后我使用test my_test;诸如此类的东西创建它的实例 my_test.a = 5......这在我的VStudio C++中工作正常.这会在gcc以后发挥作用吗?

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

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

Ben*_*ley 19

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
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*yan 18

和...之间的不同:

struct Name {};
Run Code Online (Sandbox Code Playgroud)

和

typedef struct Name {} Name;
Run Code Online (Sandbox Code Playgroud)

是的,在C中,你需要使用:

struct Name instance_name;
Run Code Online (Sandbox Code Playgroud)

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

Name instance_name;
Run Code Online (Sandbox Code Playgroud)

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

至于最后的变化:

typedef struct { /* ... */ } Name;
Run Code Online (Sandbox Code Playgroud)

上面的代码创建了一个名为struct的未命名结构.您可以像使用这样的方式使用这样的结构typedef struct Name { /* ... */ } Name;,但是编译器通常会发出结构的名称(而不是别名),因此如果您为其命名并且typedef为as,则可能会获得更好的涉及结构的错误消息.反对typedef一个匿名结构.


Jon*_*ler 7

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

typedef struct test {
   int a;
   int b;
};
Run Code Online (Sandbox Code Playgroud)

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

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

语法合法; 它没用,就是这样.typedef可以省略关键字而不用稍微改变程序的含义.

你可以做:

typedef struct test {
   int a;
   int b;
} test;
Run Code Online (Sandbox Code Playgroud)

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