`struct X typedef` 与 `typedef struct X` 的含义是什么?

What is the meaning of `struct X typedef` vs. `typedef struct X`?(`struct X typedef` 与 `typedef struct X` 的含义是什么?)
本文介绍了`struct X typedef` 与 `typedef struct X` 的含义是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我在现有代码库中有以下(工作)代码,在 C 和 C++ 之间共享的包含文件中使用,在 MSVC (2010) 和 Windows DDK 上编译:

I have the following (working) code in an existing code base, used in include file that is shared between C and C++, compiling on MSVC (2010) and Windows DDK:

struct X {
    USHORT x;
} typedef X, *PX;

还有:

enum MY_ENUM {
    enum_item_1,
    enum_item_2 
} typedef MY_ENUM;

据我所知,正确的定义应该是这样的:

As far as I know, correct definition should look like this:

typedef struct {
    USHORT x;
} X, *PX;

下面的表格有什么目的吗?我错过了什么吗?

Is there any purpose for having the form below? Am I missing something?

推荐答案

typedef <别名>typedef 是有效的,仅来自语言语法定义.

The fact that both typedef <type> <alias> and <type> typedef <alias> are valid simply comes from the language grammar definition.

typedef 被归类为 storage-class specfifier(就像 staticauto),并且类型本身被称为类型说明符.从标准第 6.7 节中的语法定义中,您会看到这些可以自由互换:

typedef is classified as a storage-class specfifier (just like static, auto), and the type itself is known as the type-specifier. From the syntax definitions in section 6.7 of the standard, you'll see that these are free to be interchanged:

declaration:
    declaration-specifiers init-declarator-list ;

declaration-specifiers:
    storage-class-specifier declaration-specifiers
    type-specifier declaration-specifiers
    type-qualifier declaration-specifiers
    function-specifier declaration-specifiers

init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator

init-declarator:
    declarator
    declarator = initializer

(当然,请注意,这对于结构体和非结构体同样适用,这意味着 double typedef 麻烦; 也是有效的.)

(Note, of course, that this is equally true for structs and for non-structs, meaning that double typedef trouble; is also valid.)

这篇关于`struct X typedef` 与 `typedef struct X` 的含义是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)