在 typedef 声明中使用逗号?

Use of comma in a typedef declaration?

此声明 C99/C11 合规吗?

typedef struct element {
    char *data; 
    struct element* next;
} element, *list, elements[5];

我找不到它在标准中工作的原因。

是的,它符合标准。 typedef 声明类似于普通声明,只是它们声明的标识符成为对象类型的类型别名,如果声明中没有 typedef,则标识符将成为对象的类型。

所以虽然

int integer, *pointer_to_integer;

声明一个名为 integerint 对象和一个名为 pointer_to_integer

int * 对象
typedef int integer, *pointer_to_integer;

将声明一个名为 integerint 类型别名和一个名为 pointer_to_integer.

int * 类型别名

从语法的角度来看,尽管不是功能上的,typedef 只是一个(假的)存储分类器(如 externautostaticregister_Thread_local).

你的声明

typedef struct element {
    char *data; 
    struct element* next;
} element, *list, elements[5];

稍微复杂一些,因为它还 定义了 struct element 数据类型,但它等同于:

struct element {
    char *data; 
    struct element* next;
}; 
// <= definition of the `struct element` data type
// also OK if it comes after the typedefs
// (the `struct element` part of the typedef would then
// sort of forward-declare the struct )

/*the type aliases: */
typedef struct element 
      element, *list, elements[5];

-- 它将 element 声明为 struct element 的类型别名,将 list 声明为 struct element * 的类型别名,将 elements 声明为类型别名至 struct element [5].

在 C 语法中,typedef 关键字的作用类似于存储-class 说明符(如 externstatic),根据 C 2018 6.7.1,类型定义只是一个声明。像其他声明一样,它可能有一个 声明符列表 以逗号分隔 (6.7 1).

问题中的typedefelement定义为struct element类型的别名,list定义为指针类型的别名struct elementelements 作为 5 struct element.

数组类型的别名