繁体   English   中英

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

[英]In C89, what is the scope of a function name in an 'old-style' function definition?

以下是合法的C89吗?

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

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

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

从C90标准(强调我的)

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

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

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

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

^这里标记声明者完成的位置以及f范围开始的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM