繁体   English   中英

typedef struct,但在关键字“struct”下保留新类型的命名空间

[英]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 中固有的,就像它们在CC++ ,但也有一些解释,例如: 如讨论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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM