我目前正在使用C ++ IDE来处理需要在C上工作的东西,并且希望确保稍后我不会遇到问题。在制作下面的结构后:
typedef struct test {
int a;
int b;
};
然后我使用创建它的实例
test my_test;
然后像my_test.a = 5
等等......这在我的VStudio C ++中运行良好。
这会在以后的gcc
上发挥作用吗?
我阅读了相关的问题(我看到我不是第一个遇到这类问题的人),但似乎没有人像我那样使用。
事实上,typedef struct {//stuff} test;
和我的版本有什么区别?
答案 0 :(得分:18)
之间的区别:
struct Name {};
和
typedef struct Name {} Name;
是吗,在C中,您需要使用:
struct Name instance_name;
对于前者,对于后者,您可以这样做:
Name instance_name;
在C ++中,在任何一种情况下都没有必要重复struct
关键字。请注意,您创建没有名称的typedef(即typedef struct Name{};
)的示例是非标准AFAIK(如果您使用关键字typedef
,那么您需要提供一个别名,以键入dede名称)。
至于最后的变化:
typedef struct { /* ... */ } Name;
上面的代码创建了一个名为struct的未命名结构。您可以像使用typedef struct Name { /* ... */ } Name;
一样使用这样的结构,但是编译器通常会发出结构的名称(而不是别名),因此如果您给它一个结构,您可能会获得更好的错误消息。 name和typedef,而不是typedef的匿名结构。
答案 1 :(得分:18)
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程序员希望能够做到第三件事,但他们不能。
答案 2 :(得分:7)
在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
。