C99中的声明符语义

时间:2014-09-26 16:21:37

标签: c c99 c11

根据ISO / IEC 9899:19996.7.5§2,

  

每个声明符声明一个标识符,并在相同的操作数时断言   表单作为声明符出现在表达式中,它用。指定一个函数或对象   范围,存储持续时间和声明说明符指示的类型。

我不知道为什么表达式突然出现在声明符语义中。你能给我一些可以帮助我理解其含义的例子吗?

3 个答案:

答案 0 :(得分:5)

说你宣布:

static int const i, j, k;

这与:

相同
static int const i;
static int const j;
static int const k;

声明者指定符static int const适用于所有标识符。

您还可以将该逻辑扩展到函数和函数指针。

static int i, (*fun1)(void), fun2(void);

与:

相同
static int i;
static int (*fun1)(void);
static int fun2(void);

只要出现在表达式部分中,http://c0x.coding-guidelines.com/6.7.5.pdf就会有一些评论。它说:

  

<强>语义

     

每个声明符声明一个标识符,并声明当表达式中出现与声明符相同形式的操作数时,它指定一个函数或对象,其范围,存储持续时间和声明说明符指示的类型。

     

<强>评论

     

表达式中标识符的形式可能与声明符中的形式相同。例如,当x指向的值是必需的时,声明符* x将在表达式中具有此形式,并且当引用数组y的元素时,声明符y [2]将在表达式中具有此形式。它是声明标识符的声明的声明者部分。有一种特殊的声明符,一个抽象声明符,它不声明标识符

我将上述解释为:

如果您声明:

int *x;

并在表达式中使用*x*x的类型为int

如果您声明

static int const *x;

并在表达式中使用*x*x的类型为static int const

其他参考资料

Static Variable Declaration (C)

Is [ ] also a declarator (when used in parameter declaration) in C?

C -- Accessing a non-const through const declaration

答案 1 :(得分:4)

说你有声明

int foo[42];

声明者部分是foo[42]。只要表达式中出现相同形式的某些形式(即foo后面跟[后跟表达式])(并且delaration在范围内),该子类型的类型表达式将是声明的类型int

换句话说:就语法而言,像

这样的声明
int *bar;

bar声明为int *类型,而是将*foo声明为int类型。

对于更复杂的例子,请参加声明

float (*op[42])(float, float);

在表达式中,相同形式的操作数可能看起来像这样

c = (*op[i])(a, b);

根据引文,右侧会有float类型。

这意味着

*op[i]

必须具有函数类型(我们忽略了函数指示符通过postfix ()衰减到相应的指针类型和函数调用这一事实实际上对指针而不是指示符有效。

这反过来意味着

op[i]

必须表示一个函数指针,我们最终到达

op

表示一个函数指针数组,我们可以应用postfix []并返回正确的类型。

有趣,不是吗;)

答案 2 :(得分:0)

所有这些都是,如果有一个像

这样的声明
const int a = 5; // declaration

然后操作数 a

这样的表达式中
x = a + b
同一范围内的

具有类型const int