当使用typedef和附加限定符时,参数列表的解析是如何工作的?它是否像文本替换一样工作,类似于#define?
示例:
typedef struct Parameters_t * Parameters_pot;
f(const Parameters_pot pars)
f(Parameters_pot const pars)
两个函数描述中的参数列表中的'const'限定符是否与数据类型相关,意味着指针指向常量结构?或者'const'的位置是否重要,在第一个函数声明中'const'意味着结构对象是常量,而在第二个声明中它意味着指针是常量?
2条答案
按热度按时间fkvaft9z1#
这不是文本替换。这就是为什么在
typedef
后面隐藏指针或数组被认为是非常糟糕的做法。这里的两个例子都相当于:f(struct Parameters_t * const pars)
只是因为它被要求,这里有一个解释正式语言律师的尝试:
C17 6.7.8规定typedef的形式为
typedef T type_ident;
,其中type_ident
是一个类型名“由T
中的声明说明符指定的类型”。说明符是复数。为了理解这一点,我们必须回到6.7和6.7.6关于“声明符”和“声明说明符”的内容。6.7.6说每个声明都可以说是由
T D1
组成,其中T
是声明说明符,D1
是声明符。static
等)和类型限定符(const
等),当然还有类型说明符(int
等)。其中几个可以选择存在于同一声明中。除了存储类说明符,作为一种特殊情况,它们永远不能相互组合(6.7.1)。碰巧的是,
typedef
算作存储类说明符,所以我们不能在typedef
中包含static
这样的东西。*
。这里重要的是*
属于declarator。形式语法(6.7.6)如下:
...
*
type-qualifier-listopt回到
typedef T type_ident;
,那么所有T
都属于该类型,包括使用的任何限定符,指针语法,数组语法等。因此,如果我们写类似
const T
的东西,那么const
将应用于整个类型T
。现在,如果我们有'T',例如const int*
“a pointer to const int”,那么const T
将因此创建一个const int* const
,“a const pointer to const int”。如果
T
是一个函数,那么它将试图声明一个无效的“const函数”。因此,对于
typedef struct Parameters_t * Parameters_pot;
示例,const
应用于struct Parameters_t *
类型。因此
f(const Parameters_pot pars)
等价于f(struct Parameters_t * const pars)
。f(Parameters_pot const pars)
也具有相同的等效含义,原因与int const
和const int
是等效的相同-声明说明符可能出现的顺序在大多数情况下没有指定。6uxekuva2#
Parameters_pot是struct Parameters_t * 的别名。所以你的例子是这样的: