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

2021-12-14 00:00:00 c struct c++ visual-studio-2010

我在现有代码库中有以下(工作)代码,在 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.)

相关文章