C 在main中声明的函数可以访问在main中声明的变量吗?
我在main中声明并初始化了一个数组,称为Edges 我还在main中声明了一些访问数组Edges的函数 代码编译并运行 它为什么有效?我认为main中声明的变量不是全局变量C 在main中声明的函数可以访问在main中声明的变量吗?,c,C,我在main中声明并初始化了一个数组,称为Edges 我还在main中声明了一些访问数组Edges的函数 代码编译并运行 它为什么有效?我认为main中声明的变量不是全局变量 编辑:请参阅Sourav的代码。您不能在C中的函数中声明函数。这意味着您不能在main中声明函数。使用-pedantic标志编译代码,您肯定会看到此警告 [Warning] ISO C forbids nested functions [-Wpedantic] 我编译了这段代码 #include <stdio.
编辑:请参阅Sourav的代码。您不能在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;
}
实际上,如果在函数内部声明函数,则内部函数只对外部函数可见,而不在
global
范围内。因此,您声明的变量和内部函数[适当地说,代码块]具有相同的作用域。因此,访问变量时没有问题
检查这个
密码
嵌套函数(annonymouse函数)不是c标准库的一部分,有一个扩展可以使用
您可以声明全局变量,并在整个程序中使用它们
Sourav实际上是正确的,您可以声明该函数,但其范围仅限于main首先,正如大多数答案所提到的,它是一个gcc扩展;不属于标准C的一部分。
以下答案仅限于gcc。 gcc将它们视为任何其他函数 e、 g.检查以下代码:
(我冒昧地扩展了您的代码,如下所示:)
add
、sub
、nop
-被转换为具有某些唯一随机后缀的程序集
e.g.
/*No .globl line is printed here.*/
.type add.2685, @function
c变量范围
)
但是,您可以在其他函数中使用它们,使用函数指针,如上面的代码所示
关于getOperation
中的局部变量(例如a
):使用rbp
寄存器从add
/sub
/nop
访问它们。提示:使用
gcc-S
编译一个具有“本地函数”的小代码,以了解到底发生了什么…:) 那么,当我在main中声明一个函数时,我要声明什么呢?@user2108462您可能正在使用一个允许您这样做的编译器,在这种情况下,您需要查看它的文档,了解它是如何工作的。(或者告诉我们您使用什么编译器,以便我们可以为您执行此操作)我正在linux上使用gcc。您能显示您的代码吗?显示您的代码。我对main中的函数很困惑。代码超过1100行,所以我将给出一个itOkay的摘要,我用我的代码更新了它。这段代码甚至可以编译?所以main中声明的任何函数都可以访问main中声明的任何变量?@user2108462首先获取概念。该内部函数不能作为适当的函数调用。这是一个简单的代码块
,就像main中的其他行一样。这完全是误导。使用-pedantic
标志编译代码。嵌套函数在C.yer中是不允许的,因为main的行为有点像外部容器。但是,Sourav还是正确的,它只是一个代码块,因此不需要整个函数声明。我认为嵌套函数是gcc唯一的东西。这与c有什么关系?
#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]#
#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;
}
e.g.
.globl getOperation /*This line will be missing in case of static functions.*/
.type getOperation, @function
e.g.
/*No .globl line is printed here.*/
.type add.2685, @function