C样式结构声明

Kla*_*uss 8 c struct

我有一个关于C风格结构的快速问题.我正在挖掘一些示例代码,并发现以下列方式声明的结构:

typedef struct _STRUCTNAME
{
   // struct contents
} STRUCTNAME;
Run Code Online (Sandbox Code Playgroud)

请注意STRUCTNAME第二次出现时缺少下划线.我的理解是,这将声明一个名为STRUCTNAME的_STRUCTNAME,并且不能再实例化此结构的对象.

但是,情况似乎并非如此.除了在一个地方之外,这种类型的结构从未在代码中实际实例化:在随机位置使用的此类对象的全局数组中:

const struct STRUCTNAME ARRAYNAME[] = 
{
   // various STRUCTNAMEs declared here
};
Run Code Online (Sandbox Code Playgroud)

注意再次缺少下划线(我认为是实例化对象的名称?)

我的理解完全没了?

有人能解释一下吗

Ada*_*ras 7

typedef struct _STRUCTNAME
{
   // struct contents
} STRUCTNAME;
Run Code Online (Sandbox Code Playgroud)

这段代码做了两件事:

  1. 定义一个名为struct _STRUCTNAME和的结构
  2. 创建一个typedef名为的结构STRUCTNAME.

这样做的原因是,在正确的C代码中,您以其他方式声明的方式struct(如上所述)将如下所示:

struct _STRUCTNAME structInstance;
Run Code Online (Sandbox Code Playgroud)

但是,typedef在适当的位置,您可以简单地使用以下内容:

STRUCTNAME structInstance;
Run Code Online (Sandbox Code Playgroud)

enum声明也是如此.


Mic*_*urr 4

STRUCTNAME是 typedef 名称。

_STRUCTNAME是结构的“标签”,它位于不同的命名空间中。

在 ANSI 标准化之前,结构标记命名空间在许多编译器中并不是独立的,因此为了防止与 typedef 名称发生名称冲突,它必须不同。然而,由于标准化,标签名称不需要不同。

您会看到这种习惯用法经常在 Windows 代码中使用,毫无疑问,因为 SDK 中的许多示例都是如此。Raymond Chen 不久前写了一篇关于此事的博文:

另外,我确信会有一些关于如何_STRUCTNAME为实现保留标识符的注释,因此在任何情况下使用该形式都不是一个好主意。

  • “标签”只是 C 标准用于表示结构体、联合体或枚举的名称/标识符的术语。 (2认同)