C 与 C++ 中的 struct 和 typedef

2021-12-23 00:00:00 c struct c++ typedef

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

I am currently using a C++ IDE for something that will need to work on C, and wanted to make sure that I won't have problems with this later on. After making the struct below:

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

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

I then create an instance of it using test my_test; then stuff like my_test.a = 5, etc... and this works fine in my VStudio C++. Is this going to work on gcc later on?

我阅读了弹出的相关问题(我也不是第一个提出此类问题的人),但似乎没有人像我一样使用.

I read the related questions that popped up (I see I am not the first person with this kind of question, either) but no one seemed to use the way I did.

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

In fact, what is the difference between typedef struct {//stuff} test; and my version?

推荐答案

两者的区别:

struct Name {};

typedef struct Name {} Name;

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

Is that, in C, you need to use:

struct Name instance_name;

使用前者,而使用后者您可以:

With the former, whereas with the latter you may do:

Name instance_name;

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

In C++, it is not necessary to repeat the struct keyword in either case. Note that your example in which you create a typedef with no name (i.e. typedef struct Name{};) is non-standard AFAIK (if you use the keyword typedef, then you need to supply an alias to which to typedef that name).

至于最后一个变化:

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

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

The code above creates an unnamed struct that is aliased to Name. You would use such a struct just the same way you would with typedef struct Name { /* ... */ } Name;, however compilers often emit the name of the struct (not the alias), and so you may get better error messages involving the struct if you give it a name and typedef that as opposed to typedef'ing an anonymous struct.

相关文章