Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构don';你不能定义类型吗? 我刚刚开始学习C语言,有一个专业的java背景和一些(如果没有太多的)C++知识,我很惊讶C在这方面没有用。 struct Point { int x; int y; }; Point p; p.x = 0; p.y = 0;_C - Fatal编程技术网

C结构don';你不能定义类型吗? 我刚刚开始学习C语言,有一个专业的java背景和一些(如果没有太多的)C++知识,我很惊讶C在这方面没有用。 struct Point { int x; int y; }; Point p; p.x = 0; p.y = 0;

C结构don';你不能定义类型吗? 我刚刚开始学习C语言,有一个专业的java背景和一些(如果没有太多的)C++知识,我很惊讶C在这方面没有用。 struct Point { int x; int y; }; Point p; p.x = 0; p.y = 0;,c,C,似乎我必须使用struct Point作为类型或使用typedef声明p。这段代码在C99中有效吗?或者这是一个“C++的东西”?这就是C的工作方式。在C中,你必须说: typedef struct Point { int x; int y; } Point; 然后您将有一个名为Point的类型,它满足您的需要 在C++中,定义它的方式就足够了。 据我所知,C99中没有一个 TyPulf< /Cube >不应该有效(因为这只是C的工作方式),但是它在C++中作为一个< C++

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

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

typedef struct Point {
    int x;
    int y;
} Point;
然后您将有一个名为
Point
的类型,它满足您的需要


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

据我所知,C99中没有一个<代码> TyPulf< /Cube >不应该有效(因为这只是C的工作方式),但是它在C++中作为一个< C++ > C++中的结构代码< /C> >所有的成员都是默认的。< /P> < P>它在C99中不起作用,它是C++的东西。你要么说
struct Point
,要么在C中使用typedef。

不,struct不定义新类型。您需要的是:

typedef struct {
   int x; int y;
} Point;
现在,Point是您可以使用的新类型:

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

结构不是类型。可以从结构创建点,如下所示:

struct Point p;
p.x = 0;
p.y = 0;
如果要将结构用作类型,则必须对其进行typedef。这在C和C++中都适用:

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

但是,如果必须向前声明结构,以使其能够具有指向相同类型或循环依赖项的结构的指针,请始终为结构指定一个名称。

首先需要将点设置为如下类型:

typedef struct Point {
    int x;
    int y;
} Point;
这允许您使用
作为类型,或
结构点

即:

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

typedef struct _point {
       ...
} Point;

你两个都会碰到。最后一个例子告诉我,我不应该使用
struct\u point
,它并不意味着要公开,除非类型
point

struct point
是类型,就像
union Foo
是类型一样。您可以使用
typedef
将其别名为另一个名称-
typedef struct Point

在C中,结构可以有两种名称:标记名和类型名。标记名只能在前缀为struct时使用,如:

struct mytag { int a; }
struct mytag mystruct;
typedef允许您同时定义标记名和类型名。可以在不使用结构前缀的情况下使用类型名称:

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

在C语言中,两者之间没有混淆

struct Point {
    int x;
    int y;
};

这是两种不同的类型,分别称为
struct Point
union Point

C99标准第6.7.2.1节规定:

6结构和联合说明符 同样的形式。关键字
struct
union
表示正在 分别指定为 结构类型或联合类型

7 存在结构声明列表 在结构或联合说明符中 在 翻译股

因此它最明确地声明了一个类型。第6.7.6节给出了C中类型名称的语法,包括6.7.2中的说明符限定符列表,其形式为结构或联合标识符

这段代码在C99中有效吗?或者这是一个“C++的东西”

否,C99不决定将结构类型提升到具有相同名称的枚举类型和联合类型之上。它是一个“C++的东西”,因为结构和类在C++中基本相同,类对C++非常重要。
Point           a tag
struct Point    a type

typedef struct {
    . . .
} Point_t;

Point_t         a type
我经常看到一个为什么?写在字里行间。毕竟,仅仅说
点x似乎是完全合理的,那你为什么不能呢

碰巧的是,C的早期实现为标记和其他标识符建立了一个单独的名称空间。一旦以这种方式定义了该语言,就不可能允许将struct标记用作类型,因为所有在普通标识符和标记之间存在名称冲突的现有代码都会突然出错


1.这4个名称空间是:
--标签名称(通过标签声明和使用的语法消除歧义)
--关键字struct、union或enum的结构、联合和枚举(通过跟随任意项消除歧义)的标记
--机构或工会的成员;每个结构或联合都有一个单独的名称 其成员的空间(通过用于访问 通过.或->运算符创建的成员)
--所有其他标识符,称为普通标识符(在普通声明器中声明或作为 枚举常数)

将p声明为
结构点p。您可以使用typedef,但我建议您将您的类型称为
struct Point
@PP:I第二个问题:@PP为什么?你眼中的typedef有什么问题?@Grumdrig:我从未主张通过typedef重新定义一种语言。这使得代码维护和审查更加困难。如果某物是一个结构,那么就这样说。当然,在某些情况下,不同的int类型更好地充当typedef。但是我不相信经常有一个好的理由对结构做同样的事情。同样,这是反谷歌围棋的哲学,即关键字被视为邪恶,而资本化被用来区分公共/私人功能;但是我更喜欢显式。@格鲁德利格-给一个已经有一个常量甚至只有一个指针的typedef添加一个常量或常量指针“modifier”是一件痛苦的事。向下投票,因为这肯定是自K&R C以来一直有效的。
typedef
struct
enum
之间有很大的区别。Mikael是对的,C++不要求在声明结构类型时使用Strut。为什么答案被否决了?啊,重新投票,因为误读了问题/答案;从技术上讲,Mikael是正确的,如果需要struct typename而事先没有
struct
关键字,则需要typedef。作为C的长期用户,我坚持我的建议,即类型(struct)是显式的
union Point {
    int x;
    int y;
};
Point           a tag
struct Point    a type

typedef struct {
    . . .
} Point_t;

Point_t         a type