What is the point of creating a typedef of an anonymous structure?
我对C比较陌生,遇到了一个没有名字的结构的typedef。
这有什么意义?
1 2 3 4 5 6 7
| #define POLY(name,deg) \
term name[deg] = {0};
typedef struct {
int coeff ;
int exp;
} term ; |
- typedef别名有一个名称;它缺少的是一个标记。
- 你说的标签是什么意思?
- term是此类型的名称。
- @briantbrennglass"tag"是结构名称的技术用语。当您声明像struct A { ..}这样的结构时,A就是"标记"。例如,匿名结构没有标记。
- 这是有道理的。谢谢
可以单独使用term来表示类型。在C语言中,使用struct term { ... };时,必须使用struct term来引用类型。
这与C++不同,其中EDCOX1(1)的定义隐含地将EDCOX1、2、EDCX1和0单独引入有效引用。
- 所以它是结构术语的缩写?
- 它是匿名结构的简写。
- 我看到的大多数结构都有带下划线的标记,因此它看起来像"typedef struct int coeff;int exp;term;"
- @briantbrennglass term是一个类型别名。它对紧跟在typedef关键字后面的类型进行别名(这就是所有类型别名在C中的工作方式)。在本例中,这是一种匿名(无标记)复合类型。作为匿名类型,您不能使用ecx1(2),因为没有这样的名称。但是,由于别名的原因,您可以使用cx1(3),其含义也很清楚。
- 是和否;是:任何typedef引入一个别名,然后是一个"速记",如果你愿意的话;否:当你引入一个没有"名称"的匿名结构时,你将没有机会引用该结构,否则,就没有速记的可能;这是当时唯一的可能。
- @bwebb fiy,根据C标准,在类型(或标识符或宏名称)前面加下划线是未定义的行为。带有前导下划线的名称保留用于实现。所以请不要这样做。
- 我在另一条线索中看到了这个评论。仅供参考,第166页,共C99草案,全部相同?以下划线开头、大写字母或其他下划线的ERS始终保留供任何使用。所有标识?以下划线开头的ERS始终保留用作标识?呃?普通和标记名称空间中的le scope。
- @ EugeneSh。我一直在研究这个问题,为什么我这么做,为什么我在专业代码中看到它。这似乎是一个误区:规则5.6(建议):除了结构成员和联合成员名称外,一个名称空间中的任何标识符的拼写都不应与另一个名称空间中的标识符相同。[米斯拉C 2004 ]
- @我在一个非常专业的环境中工作,到处都能看到它:)但是我们最近采用了SEI认证标准,现在在这方面有很多问题。下面是帮助解释这个相当模糊的标准措辞的页面:c-faq.com/decl/namespace.html
- @Eugenesh你能帮我理解你所说的"带有前导下划线的名称是为实现而保留的"是什么意思吗?这是否意味着我不应该用structname来编写库?这是否意味着如果我编写的嵌入式代码不是库,我就不必担心?事先谢谢。编辑查找SEI证书
- bwebb"这是否意味着如果我编写的嵌入式代码不是库,我就不必担心?"是的,继续担心。作为@尤尼什。在这里说,"不要这样做"。所有标识?ERS……"来自C规范。