2012-08-08 237 views
5

我在下面的代碼中遇到了一些問題,特別是在header.c中,我無法在header.h中訪問extern int x變量...爲什麼? .h中的extern變量不是全局變量嗎?我如何在其他文件上使用它?C未定義的參考

=== header.h ===

#ifndef HDR_H 
#define HDR_H 

extern int x; 
void function(); 

#endif 

=== header.c ===

#include <stdio.h> 
#include "header.h" 

void function() 
{ 
    printf("%d", x); //****undefined reference to x, why?**** 
} 

=== sample.c文件===

int main() 
{ 
    int x = 1; 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
+1

可能之前'在主功能x'刪除'int'。這將阻止在主函數中創建一個新的局部變量,其名稱與全局變量 – bph 2012-08-08 09:08:48

+0

(已刪除;意外添加的註釋)相同 – 2012-08-08 09:13:14

+0

另請參見有關[http:// stackoverflow。COM /問題/ 7610321 /差-A-的extern-INT-A-42之間-的extern-INT-] [1] [1]:http://stackoverflow.com/questions/7610321/difference -between-extern-int-a-extern-int-a-42 – 2012-08-08 09:15:05

回答

1

extern聲明瞭一個變量,但沒有定義它。它基本上告訴編譯器在其他地方有一個定義x。要解決以下內容添加到header.c(或其他一些.c文件,但只一個文件.c):

int x; 

注意,在main()局部變量x會隱藏全局變量x

1

確實extern int x;意味着x將被定義在另一個地方/翻譯單位。

編譯器期望在全局範圍內找到x的定義。

3

extern關鍵字說變量存在,但不創建它。編譯器希望另一個模塊具有一個帶有該名稱的全局變量,並且鏈接器將做正確的事情來加入它們。

您需要更改sample.c這樣的:

/* x is a global exported from sample.c */ 
int x = 1; 

int main() 
{ 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
7

聲明

extern int x; 

告訴編譯器,在一些源文件會出現一個全球變量命名x。但是,在main函數中,您聲明瞭本地變量x。在main之外移動該聲明以使其成爲全局。

0

我會整理/修改你這樣的代碼,並擺脫header.c

=== sample.h ===

#ifndef SAMPLE_H 
#define SAMPLE_H 

extern int x; 
void function(); 

#endif 

=== sample.c文件的===

#include <stdio.h> 
#include "sample.h" 

int x; 

void function() 
{ 
    printf("%d", x); 
} 

int main() 
{ 
    x = 1; 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
+0

Got it!感謝大家! – Analyn 2012-08-09 01:21:17