簡體   English   中英

主聲明中的函數可以訪問main中聲明的變量嗎?

[英]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編譯它並檢查生成的匯編代碼,它將顯示

  1. 函數getOperationmain無需任何名稱更改即可轉換為程序集。 因此,可以從任何函數(在此文件中,甚至從其他文件中)調用這些文件。

     eg .globl getOperation /*This line will be missing in case of static functions.*/ .type getOperation, @function 
  2. 函數addsubnop會轉換為具有一些唯一隨機后綴的程序集。

     eg /*No .globl line is printed here.*/ .type add.2685, @function 

由於名稱已更改,因此無法從其他功能調用它們。 只有“父函數”(在這種情況下為getOperation )才具有函數名稱的信息。 (有關更多詳細信息,請檢查c variable scope 。)

但是,您可以使用函數指針在其他函數中使用它們,如上面的代碼所示。

關於在局部變量getOperationa為例):他們是從訪問add / sub / nop使用rbp寄存器。
提示:用gcc -S編譯一個具有“局部功能”的小代碼,以了解到底發生了什么.. :-)

嵌套函數(匿名函數)不是c標准庫的一部分,可以使用擴展名。

您可以聲明全局變量,並在整個程序中使用它們。


Sourav實際上是正確的,您可以聲明該函數,但其​​范圍僅限於main

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM