当参数名与函数名重名时,C语言中优先级如何判定?
在C语言中,函数形参会屏蔽同名全局函数吗?
在foo()函数体内,完全可以确定thing指代的是传入的形参,而非同名的全局函数。
C语言标准明确规定了标识符的作用域优先级规则:
- 函数形参属于函数的局部作用域,其优先级高于全局作用域的同名标识符。
- 当局部作用域中存在某个标识符时,全局作用域的同名标识符会被“屏蔽”——在该局部作用域内,直接使用这个名称时,访问的是局部版本,而非全局的。
举个直观的验证示例:
#include <stdio.h> typedef struct { int id; } thing_t; // 全局函数thing thing_t *thing(int id) { static thing_t t; t.id = id; return &t; } // 形参名为thing的函数foo void foo(thing_t *thing) { // 此处的thing是形参指针,访问的是传入的变量 printf("foo中thing的id值:%d\n", thing->id); // 若想强行访问全局的thing函数,需要非常怪异的类型转换(仅作演示,实际绝对不要这么写) // 但此时转换后得到的也不是原函数,进一步证明形参屏蔽了全局函数 thing_t *(*func_ptr)(int) = (thing_t *(*)(int))thing; } int main() { thing_t *t = thing(123); foo(t); return 0; }
这种同名标识符的屏蔽是C语言作用域规则的基本特性,和你提到的一样,这确实是糟糕的编码风格,极易引发混淆,实际开发中一定要避免。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

