我有一个我在主要名为Edges中声明和初始化的数组。
我还在main中声明了一些访问名为Edges的数组的函数。
代码编译和工作。
为什么会这样?我认为在main中声明的变量不是全局变量。
编辑:请参阅Sourav的代码。
答案 0 :(得分:4)
实际上,如果在函数内部声明一个函数,则内部函数只对外部函数可见,而不在global
范围内。因此,您和内部函数[适当的,代码块]声明的变量具有相同的范围。因此,访问变量没有问题。
检查一下
#include <stdio.h>
#include <stdlib.h>
int innerfunc();
int main()
{
int outer = 5;
int innerfunc()
{
printf("outer is %d\n", outer);
}
innerfunc();
return 0;
}
[sourav@infba01383 so_overflow]# ./a.out
outer is 5
[sourav@infba01383 so_overflow]#
答案 1 :(得分:2)
您无法在C中的函数内声明函数。这意味着您无法在main
内声明函数。使用-pedantic
标志编译代码,您肯定会看到此警告;
[Warning] ISO C forbids nested functions [-Wpedantic]
我编译了这段代码
#include <stdio.h>
void void print(int *);
int main()
{
int a[2] = {1,3};
void print(int *a)
{
printf("%d", *a);
}
print(a);
return 0;
}
并收到警告
[Warning] ISO C forbids nested functions [-Wpedantic]
答案 2 :(得分:1)
首先,正如大多数答案所提到的,它是一个gcc扩展;不属于标准C.
以下答案严格限于gcc。
gcc会将它们视为任何其他功能。
e.g。检查以下代码:
(我冒昧地扩展你的代码如下:)
#include <stdio.h>
#include <stdlib.h>
typedef int operation(int num1, int num2); // for function pointer...
operation* getOperation(char oper)
{
int a=10;
int add(int x, int y){return x+y+a;}
int sub(int x, int y){return x-y+a;}
int nop(int x, int y){return a;}
if(oper=='+')return add;
if(oper=='-')return sub;
return nop;
}
int main()
{
operation *my_op;
my_op=getOperation('+');
printf("%d\n",my_op(5,3));
my_op=getOperation('-');
printf("%d\n",my_op(5,3));
return 0;
}
如果您使用gcc -S
&amp;编译它检查生成的汇编代码,它会显示
功能 - getOperation
&amp; main
- 转换为汇编,没有任何名称更改。因此,可以从任何函数(在此文件中或甚至从其他文件中调用)来调用它们。
e.g.
.globl getOperation /*This line will be missing in case of static functions.*/
.type getOperation, @function
函数 - add
,sub
,nop
- 将转换为具有一些唯一随机后缀的程序集。
e.g.
/*No .globl line is printed here.*/
.type add.2685, @function
由于名称已更改,因此您无法从其他功能中调用它们。只有'父函数'(在这种情况下为getOperation
)具有函数名称的信息。 (有关详细信息,请查看c variable scope
。)
但是,您可以使用函数指针在其他函数中使用它们,如上面的代码所示。
关于getOperation
中的局部变量(例如a
):使用add
从sub
/ nop
/ rbp
访问这些变量注册。
提示:使用gcc -S
编译一个包含“本地函数”的小代码,以了解究竟发生了什么......: - )
答案 3 :(得分:0)
嵌套函数(annonymouse函数)不是c标准库的一部分,有一个可以使用的扩展。
您可以声明全局变量并在整个程序中使用它们。
Sourav实际上是正确的,您可以声明该函数,但其范围仅限于main