![](/img/trans.png)
[英]Same name of a file scope variable and a function parameter in C possible. Possible to distinguish?
[英]Scope of a variable and function name
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
int sum(int,int);
int sum(int x, int size) {
int sum = 0;
printf("%p\n", &x);
printf("%p\n", &size);
printf("%p\n", &sum);
sum(x,size);
return 0;
}
int main() {
sum(2,4);
return 0;
}
而我得到的错误是:
hello.c:11:5: error: called object type 'int' is not a function or function pointer
sum(x,size);
~~~^
你在这里改变了sum
的含义:
int sum = 0;
从现在开始,在声明它的范围内, sum
是一个int
,这变得无稽之谈:
sum(x,size); /* Wat? sum is an int!!! */
不要这样做,你的代码将编译。 编译完成后,您可以担心停止递归。
如果为同一名称空间中的不同实体定义两个相同名称的单独标识符,则它们可能会重叠。 C11
标准,章节§6.2.1陈述,
如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠....
请参阅脚注:为什么在这种情况下,两个sum
都在同一名称空间中
因此,一旦您使用其他类型重新定义标识符,
....如果是这样,一个实体( 内部范围 )的范围将严格地在另一个实体( 外部范围 )的范围之前结束。 在内部范围内,标识符指定在内部范围内声明的实体; 在外部作用域中声明的实体在内部作用域内是隐藏的 (并且不可见)。
这意味着,在你的情况下,在函数sum()
内部,当你定义int sum
,基本上你是在遮蔽函数 sum
。 在重新定义之后, sum
是该函数范围中 int
类型的标识符。 因此,在函数sum()
,你不能调用sum()
因为它现在是一个int
类型。
但是,FWIW, main()
sum()
调用(或者更确切地说,外部sum()
本身)应该是有效的,因为在这一点上, int sum
将超出范围。
解决方案:将int sum
变量名称更改为其他名称。
感谢@pmg进行更正
编辑:
如前所述通过@juanchopanza在对方的回答 ,改变阴影变量名后,你的程序将编译,一旦你运行它,你会面临无穷递归由于无条件呼叫来sum()
内的sum()
本身。 您需要添加一些中断条件以结束(从中return
)递归。
脚注:
参考C11
, 章节§6.2.3 , 名称空间 ,我们可以说,各种类型的标识符都有单独的名称空间 ,例如1)标签名称2)结构,联合和枚举的标签,3)成员结构或联合以及4)所有其他标识符。
因此,在这种特殊情况下,函数sum()
和int sum
定义将驻留在相同的名称空间中,用于sum()
函数作用域
范围很重要
sum
具有全局范围。 变量sum
是本地的,具有局部范围。
冲突是因为在sum()
你调用sum()
。 现在在函数sum()
里面有2个同名和不同类型的对象,因此出错。
如果你有类似的东西
int sum()
{
int sum = 0;
sum = 10;
printf("%d\n",sum);
}
然后你的代码就没事了。 由于变量sum
是函数sum()
局部变量,因此它是函数sum()
具有该名称的唯一对象。
而不是担心这更好地重命名变量,并确保变量名称和函数名称是不同的
你需要将int sum = 0
更改为int y = 0
,你的程序也会因为你不能在sum(x,sum)
处停止递归而中断
只需将sum函数中的变量和名称更改为total
#include <stdlib.h>
#include <stdio.h>
int sum(int,int);
int sum(int x, int size) {
int total = 0;
printf("%p\n", &x);
printf("%p\n", &size);
printf("%p\n", &total);
sum(x,size);
return 0;
}
int main() {
sum(2,4);
return 0;
}
变量和函数具有相同的名称,这就是为什么它在引用函数和变量的同时导致错误的原因
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.