C结构不定义类型?

时间:2009-11-15 14:49:46

标签: c

我刚开始用专业的Java背景和一些(如果没有太多)C ++知识学习C,我很惊讶这在C中不起作用:

struct Point {
    int x;
    int y;
};

Point p;

p.x = 0;
p.y = 0;

似乎我必须使用p作为类型或使用struct Point来声明typedef。这段代码在C99中有效吗?或者这是“C ++的事情”?

10 个答案:

答案 0 :(得分:7)

据我所知,它不应该在C99中没有typedef(因为这只是C的工作方式),但它在C ++中作为C ++中的struct工作只是class,默认情况下公开所有成员。

答案 1 :(得分:5)

不,结构不定义新类型。你需要的是:

typedef struct {
   int x; int y;
} Point;

Now Point是您可以使用的新类型:

Point p;
p.x = 0; p.y = 0;

答案 2 :(得分:4)

struct Point 类型,就像union Foo类型一样。您可以使用typedef将其别名改为其他名称 - typedef struct Point Point;

答案 3 :(得分:4)

在C中,

之间没有混淆
struct Point {
    int x;
    int y;
};

union Point {
    int x;
    int y;
};

这两种类型分别称为struct Pointunion Point

C99标准第6.7.2.1节规定:

  

6结构和联合说明符具有   相同的形式。关键字struct和   union表示类型为   指定的分别是a   结构类型或联合类型。

     

7   存在struct-declaration-list   在struct-or-union-specifier中   在一个中声明一个新类型   翻译单位。

所以它最明确地宣布了一种类型。 C语言中类型名称的语法在6.7.6节中给出,并包含6.7.2中的 specifier-qualifier-list ,其格式为struct-or-union identifier

  

此代码是否适用于C99?或者这是“C ++的事情”?

不,C99不决定在枚举类型和具有相同名称的联合类型上提升结构类型。它是一个“C ++的东西”,因为结构和类在C ++中大多是相同的东西,而类对C ++很重要。

答案 4 :(得分:2)

因此...

Point           a tag
struct Point    a type

typedef struct {
    . . .
} Point_t;

Point_t         a type

我经常在行之间看到 为什么? 。毕竟,仅仅说Point x;似乎是完全合理的,所以为什么不能呢?

实际上,C的早期实现为标记与其他标识符建立了单独的名称空间。实际上 4 名称空间 1 。一旦以这种方式定义了语言,就不可能将struct标记用作类型,因为所有现有的代码都在普通标识符标记之间发生名称冲突会突然出错。


1. 4个名称空间是:
- 标签名称(通过标签声明和使用的语法消除歧义);
- 关键字struct,union或enum)的结构,联合和枚举的标记(通过以下任何方式消除歧义);
- 结构或工会的成员;每个结构或联合都有一个单独的名称 其成员的空间(通过用于访问的表达式的类型消除歧义 会员通过。或 - >操作者);
- 所有其他标识符,称为普通标识符(在普通声明符中声明或作为 枚举常量) 功能

答案 5 :(得分:1)

它在C99中不起作用,它是一个C ++的东西。您必须说struct Point或在C中使用typedef。

答案 6 :(得分:1)

结构不是类型。您可以按结构从结构创建一个点:

struct Point p;
p.x = 0;
p.y = 0;

如果要将结构用作类型,则必须键入它。这适用于C和C ++:

typedef struct _point {
    int x;
    int y;
} Point;

总是给你的struct命名,如果你必须转发声明它能够指向相同类型的结构或循环依赖的结构。

答案 7 :(得分:1)

在C中,结构体可以有两种名称:标签名称和类型名称。标记名称只能在带有struct前缀的情况下使用,如:

struct mytag { int a; }
struct mytag mystruct;

typedef允许您定义标记名称和类型名称。可以在没有结构前缀的情况下使用类型名称:

typedef struct mytag { int a; } mytype;
mytype mystruct; // No struct required

答案 8 :(得分:0)

这就是C的工作方式。在C中你必须说:

typedef struct Point {
    int x;
    int y;
} Point;

然后你会有一个名为Point的类型,可以做你想要的。

在C ++中,以你的方式定义它就足够了。

答案 9 :(得分:0)

首先需要将Point设为类似的类型:

typedef struct Point {
    int x;
    int y;
} Point;

这允许您将Point用作类型,或struct Point

即:

Point *p;

sizeof(struct Point);

有些人更喜欢使结构的名称与正在创建的类型不同,例如:

typedef struct _point {
       ...
} Point;

你会遇到两者。最后一个示例告诉我,我不应该使用struct _point,除了类型Point之外,它不应该被公开。