在C89中,'旧式'函数定义中函数名的范围是什么?

时间:2014-09-13 19:39:39

标签: c gcc clang standards-compliance c89

以下是合法的C89吗?

void f(a)
char a[sizeof &f];
{
}

我的想法是肯定的,因为在声明符结束后立即开始在任何块作用域之外声明的标识符的范围,并延伸到翻译单元的末尾。因此,'f'的范围包括声明列表。

“gcc -pedantic -Wall”接受它。 “clang -pedantic -Wall”拒绝它,就像lcc一样。

1 个答案:

答案 0 :(得分:2)

来自C90标准(强调我的)

  

(C90,6.1.2.1)"结构,联合和枚举标记的范围在声明标记的类型说明符中标记出现之后开始。每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围。 任何其他标识符的范围都在其声明者完成后开始。"

所以对我来说,它也是一个有效的函数声明。

编辑:魔鬼在细节中(单词完成),经过第二次认为我认为它不是一个有效的函数声明,因为声明者在完成后没有完成void f(a)

void f(a)
char a[sizeof &f];
                   ^

^此处标记声明者的完整位置以及f范围的开始位置。