在C
struct node {
int x;
};
node *y; // incorrect
struct node *y; // correct
在C ++中
struct node{
int x;
};
node *y; // correct
y = new node; // correct
问题:为什么标签名称可以在C ++中创建指针而不是在C?
答案 0 :(得分:6)
因为C ++标准是这样说的,而C标准则没有。
我想说C ++进行了更改以使类更易于使用(记住,类和结构在C ++中基本上是相同的;它们仅在默认可见性方面不同),并且C没有效仿,因为这会破坏大量现有的C代码。
答案 1 :(得分:3)
原因不仅仅是因为标准这样说,C ++实际上有namespaces而struct
关键字允许C中的原始形式的命名空间允许你有一个结构和一个非具有相同名称的结构标识符。我们可以从C99草案标准部分6.2.3
标识符的名称空间中看到这种原始形式的命名空间,其中包含:
如果在a中的任何一点可以看到多个特定标识符的声明 在翻译单元中,句法上下文消除了引用不同实体的用法。 因此,各种标识符类别都有单独的名称空间,如下所示:
并且有以下项目符号:
- 标签名称(通过标签声明和使用的语法消除歧义);
- 结构,联合和枚举的标记(通过跟随任何24来消除歧义) 关键字struct,union或enum);
- 结构或工会的成员;每个结构或联合都有一个单独的名称 其成员的空间(通过用于访问的表达式的类型消除歧义 会员通过。或 - >操作者);
- 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。
我可以编写一个示例,但POSIX为我们提供了一个很好的例子stat,它既是函数又是 struct :< / p>
int stat(const char *restrict path, struct stat *restrict buf);
^^^^ ^^^^^^^^^^^
答案 2 :(得分:0)
如果你想在C中写出 node * y 的方式,只需
typedef struct node {
int x;
} node;