2010-11-02 54 views
8

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

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

我然后使用 test my_test;然后像my_test.a = 5,等等...这东西的作品在我的VStudio C++细创建它的一个实例。 稍后会在gcc上工作吗?

我读到了弹出的相关问题(我看到我不是第一个有这类问题的人)但似乎没有人使用我的方式。

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

+0

您可以通过打开命令提示符并输入:'gcc FilePath/foo.c'来编译程序。 – 2010-11-02 23:29:02

+2

[typedef struct vs struct definitions]可能的重复(http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions)我写了一个广泛的答案,不同之处以及每个的具体和实际含义C和C++中的这两个构造作为链接问题的答案。请阅读它以了解接受的答案中未提供的详细信息。 – 2010-11-02 23:57:30

回答

18

之间的区别:

struct Name {}; 

而且

typedef struct Name {} Name; 

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

struct Name instance_name; 

对于前者,而后者你可以这样做:

Name instance_name; 

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

至于最后变化:

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

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

+0

我刚刚注意到,'Warning'typedef':当'test'没有声明变量时忽略''是我按照我在原始代码片段中写入的方式执行操作时得到的结果。哪些问题引发了我写的东西甚至做了什么? – user472875 2010-11-02 23:35:34

+0

@ user472875:没有。这就像写作“typedef int;”。或者就像在字典中写一个定义而不给出那个意思那个词。 – 2010-11-02 23:55:23

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程序员希望能够做第三件事,但他们不能。

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的别名。