2013-07-02 85 views
1

從我收集的內容可以看出,C++中的'extern'關鍵字可用於告訴編譯器在另一個.cpp文件中定義了一個變量。我想知道這個定義是否必須是明確的,或者定義是否可以通過變量定義的.cpp文件中的函數的副作用來更改。在C++中使用extern關鍵字

//a.h 
extern int foo; 

//a.cpp 
#include <a.h> 

int foo=0; 
int func(int &foo) // EDIT: oops, forgot the type for the parameter and return statement 
{ 
foo = 10; 
return 5; 
} 
int x = func(foo); // EDIT: changed to match declaration and assigned function to dummy variable 

//b.cpp 
#include <a.h> 

int main() 
{ 
cout << foo; 
return 0; 
} 

程序可以識別富應該是10,還是會爲0?如果編譯器將foo識別爲0,是否有辦法使它可以識別爲10? 此外,我不能自己編譯和測試這個的原因是,我不知道如何編譯多個文件時,我是新=)。

編輯:謝謝你的錯誤指針,但我猜主要問題仍然是如果b.cpp可以看到foo是10還是0.乾杯!

+0

你有一些奇怪的事情發生在兩個主要功能上。您只需要一個,並且該主函數可以從b.cpp調用函數,即使它位於a.cpp中。這就是#包含的內容。另外,你的func()不需要&foo參數來工作。我會到我的電腦並很快發佈答案。哦,並將它們編譯在一起取決於您的IDE /編譯器。你有什麼? – BrainSteel

+0

@亞歷山大不,它不! @Roger'int func(&foo){...}中的'&foo'應該是什麼意思? – Praetorian

+0

@Praetorian我的壞,是那些是不同的文件的獨立。 –

回答

2

它應該是10

說明:

首先,聲明

int x=func(foo); 

將進入main函數之前被調用,並且

int foo=0; 

後二,th e foofunc將隱藏全局foo,因此func中的foo將僅應用於通過引用傳入的參數。

三,你的代碼不會被編譯。原因1:您沒有使用系統中的標題,因此您需要#include "header.h"而不是#include <header.h>。原因2:對於cout,假設您未使用過時的VC 6.0,則需要#include <iostream>並編寫std::cout

+0

謝謝你的回答以及解釋! –

+1

應該補充一點,你可以使用':: foo'來引用'func'中映射的全局'foo'。 – greatwolf

+0

由於傳遞給函數的實際參數是命名空間級別「foo」,所以命名空間級別與參數的影子根本無關緊要,因此本地引用表示完全相同的對象。 –

2

如果更正了所有的語法錯誤並構建了整個項目,那麼在該文件中將會有一個名爲'foo'的整數,並且可以從兩個源中讀取和寫入該整數。在任何地方將它設置爲一個值都可以在其他地方讀取。