[英]How can I use extern to share globe variables between source files in C++?
IDE:代碼塊13.12
-------------- main.cpp中------------------
#include<iostream>
using namespace std;
extern const int x;
int main()
{
cout << x << endl;
}
-------------- sub.cpp -------------------
extern const int x = 10;
當我嘗試運行代碼之前,編譯器顯示錯誤:
E:\\ NewProject \\ Test \\ main.cpp | 8 |未定義引用`x'|
那么,誰能告訴我如何解決這個問題呢? (我曾嘗試創建一個頭文件,就像:
extern const int x;
並讓兩個cpp文件包含此頭文件。 但這沒用)
如果我想在main.cpp上創建一個數組,就像:
int _array[x];
我該怎么辦?
我是新來的,英語不好。 非常感謝!!
extern
關鍵字說:這只是一個聲明。
對於變量,您僅需要一個定義,即。 在其他地方沒有extern
的聲明:
// foo.h
extern int i;
// foo.cc
#include "foo.h"
int i; // definition
// bar.cc
#include "foo.h"
int main () {
++i; // modifies global variable
}
const
特殊規則
const
變量的一個常見用例是,您在頭文件中定義常量,然后在程序中的其他任何地方使用它們:
// my_constants.h
const int NumHoursInDay = 24;
const int NumMinutesInHour = 60;
如果這些變量不是const
,那么將my_constants.h
包含在不同的轉換單元(源文件+它們的頭文件)中會因為有多個變量定義而導致鏈接器錯誤。
標准委員會認為這將是一個足夠普遍的用例,他們實際上為變量聲明了const
,C ++ '03 7.1.5 / 2:
在名稱空間范圍內聲明為const限定類型的對象具有內部鏈接,除非已將其顯式聲明為extern或先前已聲明具有外部鏈接。
這意味着每個翻譯單元都有自己的const
變量的私有副本。 鏈接器不會嘗試將它們合並在一起,因此不會出現錯誤。
因此,第一點是您實際上可以從exmaples中刪除extern
,並且由於const
的這種特殊行為,您的代碼可以正確編譯和鏈接。
但是,無論出於何種原因,如果您確定要先聲明變量然后在項目中使用單個定義,那么您可能已經注意到以下內容仍會生成鏈接器錯誤:
// foo.h
extern const int i;
// foo.cc
const int i = 0;
這是因為鏈接器希望在foo.h中找到i
的定義,並且由於foo.cc中的i
具有內部鏈接(即在該轉換單元之外不可見),因此鏈接器不會將這些對象視為相同。
這可以通過查看標准引用的結尾來解決:
或者除非之前宣布有外部聯系。
我們需要做的是告訴編譯器i
在foo.cc中應該有外部鏈接,首先用extern
聲明它, 然后在沒有extern
情況下定義它。
// foo.cc
extern const int i;
const int i = 0;
最好的方法是包括頭文件,這樣我們只有一個聲明:
// foo.cc
#include "foo.h" // contains the extern declaration of 'i'
const int i = 0;
數組維度
最后一點是數組維度需要是一個常量表達式 。 在這里extern const
混亂的是,當前轉換單元中未定義的extern const
變量不被視為常量表達式 :
extern const int ArrayDim;
int array[ArrayDim]; // Illegal C++
代碼可以編譯,特別是如果你使用的是g ++,因為有一個名為Variable Length Arrays的C語言特性。 在幕后,編譯器隱藏了內存分配以支持這一點。
當您打算在多個翻譯單元中使用常量並且需要將其用作常量表達式時 ,最好的選擇是在頭文件中定義常量:
// my_constants.h
const int x = 10;
#include<iostream>
#include "my_constants.h"
using namespace std;
int main()
{
int _array[x];
cout << x << endl;
}
extern
表示您的變量僅在此處聲明 ,但在另一個翻譯單元中定義 。 所以你可以有許多聲明你的常量extern const int x;
但是你必須只有一個這個常量的定義 const int x = 10;
在sub.cpp
,只需使用
const int x = 10;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.