(我有一种不安的感觉,我以前问过这个问题,但现在我找不到了。如果是这样,请随时关闭并重定向此问题......)
在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是的,我同意这是可疑的编码风格...)
2条答案
按热度按时间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
指的是参数,而不是函数:如果一个标识符在同一个命名空间中指定两个不同的实体,则作用域可能重叠。如果是这样,一个实体的作用域(* 内部作用域 )将严格地在另一个实体的作用域( 外部作用域 *)之前结束。在内部范围内,标识符指定在内部范围中声明的实体;在外部作用域中声明的实体在内部作用域中 * 隐藏 *(并且不可见)。
n9vozmp42#
函数的参数比文件作用域对象(如函数名)更“内部”,因此参数
thing
屏蔽了名为thing
的函数。这在C standard的第6.2.1p4节中详细说明了标识符的作用域:
如果一个标识符在同一个命名空间中指定两个不同的实体,则作用域可能重叠。如果是这样,一个实体的作用域(内部作用域)将严格地在另一个实体的作用域(外部作用域)之前结束。在内部作用域中,标识符指定内部作用域中声明的实体;在外部作用域中声明的实体在内部作用域中是隐藏的(并且不可见)。