我有一个关于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)
注意再次缺少下划线(我认为是实例化对象的名称?)
我的理解完全没了?
有人能解释一下吗
typedef struct _STRUCTNAME
{
// struct contents
} STRUCTNAME;
Run Code Online (Sandbox Code Playgroud)
这段代码做了两件事:
struct _STRUCTNAME和的结构typedef名为的结构STRUCTNAME.这样做的原因是,在正确的C代码中,您以其他方式声明的方式struct(如上所述)将如下所示:
struct _STRUCTNAME structInstance;
Run Code Online (Sandbox Code Playgroud)
但是,typedef在适当的位置,您可以简单地使用以下内容:
STRUCTNAME structInstance;
Run Code Online (Sandbox Code Playgroud)
enum声明也是如此.
STRUCTNAME是 typedef 名称。
_STRUCTNAME是结构的“标签”,它位于不同的命名空间中。
在 ANSI 标准化之前,结构标记命名空间在许多编译器中并不是独立的,因此为了防止与 typedef 名称发生名称冲突,它必须不同。然而,由于标准化,标签名称不需要不同。
您会看到这种习惯用法经常在 Windows 代码中使用,毫无疑问,因为 SDK 中的许多示例都是如此。Raymond Chen 不久前写了一篇关于此事的博文:
另外,我确信会有一些关于如何_STRUCTNAME为实现保留标识符的注释,因此在任何情况下使用该形式都不是一个好主意。
| 归档时间: |
|
| 查看次数: |
6858 次 |
| 最近记录: |