C与C ++中的struct和typedef

时间:2010-11-02 23:19:52

标签: c++ c struct typedef

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

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

然后我使用创建它的实例 test my_test;然后像my_test.a = 5等等......这在我的VStudio C ++中运行良好。 这会在以后的gcc上发挥作用吗?

我阅读了相关的问题(我看到我不是第一个遇到这类问题的人),但似乎没有人像我那样使用。

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

3 个答案:

答案 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