[英]Can functions declared in main access variables declared in main?
我有一個在主邊緣中聲明並初始化的數組。
我還在main中聲明了一些函數,這些函數可訪問稱為Edges的數組。
該代碼可以編譯並運行。
為什么行得通? 我認為main中聲明的變量不是全局變量。
編輯:請參閱Sourav的代碼。
實際上,如果在函數內部聲明函數,則內部函數僅對外部函數可見,而在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]#
您不能在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]
首先,正如大多數答案所提到的,它是一個gcc擴展。 不屬於標准C。
下面的答案嚴格限於gcc。
gcc確實將它們視為任何其他函數。
例如檢查以下代碼:
(我自由地擴展了您的代碼,如下所示:)
#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
編譯它並檢查生成的匯編代碼,它將顯示
函數getOperation
和main
無需任何名稱更改即可轉換為程序集。 因此,可以從任何函數(在此文件中,甚至從其他文件中)調用這些文件。
eg .globl getOperation /*This line will be missing in case of static functions.*/ .type getOperation, @function
函數add
, sub
, nop
會轉換為具有一些唯一隨機后綴的程序集。
eg /*No .globl line is printed here.*/ .type add.2685, @function
由於名稱已更改,因此無法從其他功能調用它們。 只有“父函數”(在這種情況下為getOperation
)才具有函數名稱的信息。 (有關更多詳細信息,請檢查c variable scope
。)
但是,您可以使用函數指針在其他函數中使用它們,如上面的代碼所示。
關於在局部變量getOperation
( a
為例):他們是從訪問add
/ sub
/ nop
使用rbp
寄存器。
提示:用gcc -S
編譯一個具有“局部功能”的小代碼,以了解到底發生了什么.. :-)
嵌套函數(匿名函數)不是c標准庫的一部分,可以使用擴展名。
您可以聲明全局變量,並在整個程序中使用它們。
Sourav實際上是正確的,您可以聲明該函數,但其范圍僅限於main
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.