(我有一种不安的感觉,我以前问过这个问题,但现在我找不到了.如果是这样,请随时关闭并重定向此问题...)

在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规范中有什么要说的吗?

(是的,我同意这是一种可疑的编码风格……)

推荐答案

根据C 2018 6.2.1 4,函数thing的定义将thing声明为具有file scope的标识符.其范围从其声明(具体地说,从其声明符*thing(int id)的末尾)扩展到翻译单元的末尾.

foo的定义中,参数thing的定义将thing声明为具有block scope的标识符,这也符合6.2.1 4.它的范围从其声明扩展到作为函数定义主体的块的末尾.

然后6.2.1 4的最后一句告诉我们,在foo内,thing指的是参数,而不是函数:

如果一个标识符指定了同一名称空间中的两个不同实体,则作用域可能会重叠.如果是这样的话,一个实体(inner scope)的范围将严格在另一个实体(outer scope)的范围之前结束.在内部作用域中,标识符指定在内部作用域中声明的实体;在外部作用域中声明的实体是内部作用域中的hidden个(且不可见).

C++相关问答推荐

C中出现分段错误后关闭文件

getchar读css + z还是返回css?

在C语言中使用scanf()时我无法理解的警告

返回一个包含数组的 struct

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

在Apple Silicon上编译x86的Fortran/C程序

GTK函数调用将完全不相关的char* 值搞乱

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

将数组插入数组

我在C程序的Flex/Bison中遇到语法错误

我应该在递归中使用全局变量吗

使用Open62541向OPCUA服务器发送读请求时内存泄漏

使用正则表达式获取字符串中标记的开始和结束

C struct 中的冒泡排序

通过修改c中的合并排序对数组的偶数索引进行排序

创建 makefile 来编译位于不同目录中的多个源文件

如何在 C 中的 Postgres 函数的表中 for 循环

c 中符号表缺少项目

为什么转换为 uint64_t 会改变此代码中的结果?