C语言 当参数名等于函数名时:谁赢了?

bihw5rsg  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(158)

(我有一种不安的感觉,我以前问过这个问题,但现在我找不到了。如果是这样,请随时关闭并重定向此问题......)
在C语言中,假设我有一个名为thing()的函数,还有一个使用thing作为形参的函数:

thing_t *thing(int id) { ... function that returns a *thing_t ... }

void foo(thing_t *thing) { ... function that takes a *thing_t as an argument ... }

foo()的主体中,是否可以保证thing引用传入的参数而不是同名的函数?有没有任何C规范对此有什么要说的?
(And是的,我同意这是可疑的编码风格...)

kninwzqo

kninwzqo1#

根据C 2018 6.2.1 4,函数thing的定义将thing声明为具有 file scope 的标识符。它的作用域从它的声明(具体地说,从它的声明符*thing(int id)的末尾)扩展到翻译单元的末尾。
foo的定义中的参数thing的定义将thing声明为具有 * 块范围 * 的标识符,也符合6.2.1 4。它的作用域从它的声明延伸到作为函数定义体的块的末尾。
然后6.2.1 4的最后一句告诉我们,在foo中,thing指的是参数,而不是函数:
如果一个标识符在同一个命名空间中指定两个不同的实体,则作用域可能重叠。如果是这样,一个实体的作用域(* 内部作用域 )将严格地在另一个实体的作用域( 外部作用域 *)之前结束。在内部范围内,标识符指定在内部范围中声明的实体;在外部作用域中声明的实体在内部作用域中 * 隐藏 *(并且不可见)。

n9vozmp4

n9vozmp42#

函数的参数比文件作用域对象(如函数名)更“内部”,因此参数thing屏蔽了名为thing的函数。
这在C standard的第6.2.1p4节中详细说明了标识符的作用域:
如果一个标识符在同一个命名空间中指定两个不同的实体,则作用域可能重叠。如果是这样,一个实体的作用域(内部作用域)将严格地在另一个实体的作用域(外部作用域)之前结束。在内部作用域中,标识符指定内部作用域中声明的实体;在外部作用域中声明的实体在内部作用域中是隐藏的(并且不可见)。

相关问题