[英]typedef struct but keep new type namespaced under keyword 'struct'
我怎样才能 typedef 一个结构,但仍将新类型命名为关键字'struct'下的命名空间?
例子:
struct foo {
int x;
};
typedef struct foo struct bar;
int main(void) {
struct bar bar;
bar.x = 10;
return 0;
}
但这显然不起作用。 如果有人好奇,这里是错误:
main.c:5:20: error: two or more data types in declaration specifiers
typedef struct foo struct bar;
^
main.c:5:27: warning: useless storage class specifier in empty declaration
typedef struct foo struct bar;
^
main.c: In function 'main':
main.c:9:13: error: storage size of 'bar' isn't known
struct bar bar;
我怎样才能 typedef 一个结构,但仍将新类型命名为关键字'struct'下的命名空间? .
你不能。 命名空间是一个声明性区域,它为其中的标识符(类型名称、function、变量等)提供 scope。 在C++
中定义的命名空间概念并不是C
所固有的。
因此,如果您对您的需求的微小更改感到满意,而不是做一些不自然的事情,请使用简单的 typedef:
而不是这个:
struct foo {
int x;
};
做这个:
typedef struct {
int x;
}foo;
然后这将起作用:
typedef foo bar;
int main(void )
{
bar b;
b.x = 10;
return 0;
}
注意:虽然命名空间不是 C 中固有的,就像它们在C
中C++
,但也有一些解释,例如: 如讨论here ,这证明了这一点。
我怎样才能
typedef
一个结构,但仍将新类型命名为关键字'struct'下的命名空间?
因此,您似乎想为另一种结构类型定义结构别名。
这对于typedef
是不可能的,因为它创建了一个单词别名。 新别名不能由多个空格分隔的单词组成。
但是您可以使用像struct_bar
这样的单个名称,并在名称内部实现struct
以表明bar
是一个结构。
#include <stdio.h>
struct foo {
int x;
};
typedef struct foo struct_bar;
int main(void) {
struct_bar bar;
bar.x = 10;
return 0;
}
你不能。 这不是它的工作方式。
您不能“创建”名称超过一个单词的类型,也不能使用关键字struct
引用类型别名。
在这种情况下,编写struct
的目的是通过未作为别名引入的名称来引用结构类型。 关键字是说这就是你想要做的。 但这不是名称的一部分; 它不能是名称的一部分。
幸运的是,没有理由需要甚至想要这个。
C 没有任何类型的命名空间支持(至少在 C++ 的意义上没有)。
创建typedef
时,新类型名称是单个标识符,而不是多个单词。 所以struct bar
不能是另一种类型的别名。 您必须将其称为bar
或其他单字名称。
我找到了一个适用于 cygwin 的解决方案:
struct foo {
int x;
};
struct bar {
struct foo;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.