2017-02-23 52 views
-2

我得到含有聲明若干功能的大C文件如下:Ç - void函數(無效),參數和返回值

static void function_a(void) { .... } 

void function_a(void); 

功能被主程序上面寫

在主程序調用這些函數爲:

function_a(); 

現在據我知道functi上面聲明的聲明既不使用參數,也不具有返回值。然而,在這些函數中使用了變量和數組,這些函數並沒有在這些函數中定義,而只在主程序中定義。

這真的是正確的C語法?如果函數不作爲參數傳遞,函數如何從主程序訪問數據?

此外,主程序使用變量,這些變量是在它調用的函數內計算的。

+3

它們是在主函數*還是在*文件*中定義的? – StoryTeller

+0

對不起,我剛剛編輯。它們在主函數 –

+3

上方的文件中定義。請發佈一個完整的示例而不是片段。 – Lundin

回答

5

請問您能提供更多的上下文嗎?在C中,你不能訪問另一個函數的變量,但你可以訪問全局變量。

以下程序是有效的,將輸出3,因爲i是一個全局變量,並且隨處可見。

#include <stdio.h> 

int i = 2; 

void plusone() { 
     i = i + 1; 
} 

int main() { 
     plusone(); 
     printf("i = %d\n", i); 
} 

另一方面,下面的程序將無法編譯,因爲i是本地main()功能,是看不見的其他地方。

#include <stdio.h> 

void plusone() { 
     i = i + 1; 
} 

int main() { 
     int i = 2; 
     plusone(); 
     printf("i = %d\n", i); 
} 

說的是,全局變量的使用是一個不好的做法,應該避免。

+0

好的。如果我有另一個只包含變量定義的C文件,並將該文件鏈接到包含主程序和其他功能的C文件,該怎麼辦?單獨的C-File中的變量是否也是全局變量? –

+3

@ J.M。你將不得不聲明這些變量爲'extern',以便你可以使用它們。 –

0

所以這個:

//file_a.c 
void function_a(void) 
{ 
    //... 
} 

使function_a不帶任何參數,並且不返回任何值的函數。這個函數可能被同一個文件function_a中的所有其他函數使用,或者在其他任何.c文件中,您告訴編譯器將它們放到最終的程序中。

換句話說,此功能可供您的程序的所有翻譯單元訪問。如果你有一個名爲file_a.c文件這一功能,你也有被稱爲另一個文件file_z.c你可以這樣做:

//file_z.c 
void function_z(void) 
{ 
    function_a(); 
} 

所有的罰款。

在另一方面,這

//file_b.c 
static void function_b(void) 
{ 
    //... 
} 

(我改名爲清楚起見功能)

使function_b不帶任何參數,並且不返回任何值,就像function_a功能。但是,它也表示function_b在翻譯單元中具有靜態文件範圍,該範圍始於或包含file_b.c。這意味着它不能被其他翻譯單元訪問。

所以,如果你現在試圖做到這一點file_z.c

void function_z(void) 
{ 
    function_b(); 
} 

你會得到編譯錯誤:

file_z.c:(.text+0xa): undefined reference to `function_b' 
collect2: error: ld returned 1 exit status 

因爲每個file_{a,b,z}.c是(或可能應該是)的起點,其擁有單獨的翻譯單元,並且function_bfile_b.c中被聲明爲具有靜態文件範圍,但對於其他翻譯單元而言,該功能只是「不存在」。現在

,以聲明的變量只是function_b之前,我把他們有點像這樣:

//file_a.c 
int array[10]; 
void function_a(void) 
{ 
    //... 
} 

這只是聲明瞭一個全局變量。它可以通過file_a.c中的所有函數訪問,只要它們在之後出現聲明。它也可以使用其他翻譯單元(如file_b.cfile_z.c)如果你聲明它是這樣的:

//file_b.c 
extern int array[10]; 

當你編譯一切togheter,在翻譯單元聲明與file_b.c開始將告訴編譯器array不是該file_b.c中的文件範圍變量;相反,編譯器將不得不在另一個翻譯單元中查找該變量,然後將它們鏈接在一起,以便所有函數對10個整數的塊執行相同的操作。

0

在C中,根本不可能訪問另一個函數或範圍的局部變量。 代碼編譯是否正確?如果是這些變量必須是全局定義的,或者在開頭或某個頭文件中。 如果不使它們成爲全局的,則可以從非參數函數訪問。

+0

另一個函數有另一個範圍,所以你的第一句話有點多餘。 –

+1

當然你可以訪問你的父範圍的變量。 – unwind