繁体   English   中英

变量和函数名称的范围

[英]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()函数作用域

范围很重要

  1. 此处的函数名称sum具有全局范围。
  2. 变量sum是本地的,具有局部范围。

  3. 冲突是因为在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM