mydata
也可用於其他翻譯單位。如果在另一個源中使用另一個使用相同名稱的全局變量,這可能會造成問題。這將導致標識符衝突。
要確保不會發生這種情況,你可以做mydata
一個靜態變量:
static myData* mydata = nullptr;
或把mydata
在具名命名空間:
namespace {
myData* mydata = nullptr;
}
在這種情況下,myData
做不一定是靜態的。
現在,第二種選擇通常在C++中首選,但第一種選擇將實現相同的結果,並且沒有任何內在錯誤。
請注意,全局範圍的變量有一些與它們相關的問題,與初始化有關。例如,如果將全局變量初始化爲另一個其他全局變量的值,則無法知道哪個變量會首先被初始化,因此您的變量可能會使用垃圾數據進行初始化。然而,在這種情況下,你只是將它初始化爲nullptr
,所以沒關係。但是,避免使用全局變量是一個很好的習慣,因爲有更好的方法來做到這一點。你可以用該變量爲靜態函數來代替,返回其內定義一個靜態變量:
static myData& mydata()
{
static myData mydata_instance;
return mydata_instance;
}
void init()
{
mydata().someVar = 1;
}
void someFunction1()
{
mydata().someVar = mydata().someVar1;
}
另外請注意,沒有指針使用。 mydata_instance
是一個對象,而不是指針,這就避免了必須使用new
來分配內存,這意味着您不必擔心調用delete
以後再釋放內存。 mydata()
將在第一次調用時在堆棧上創建一個myData
對象,並且由於該對象是靜態的,因此將在每次將來每次調用mydata()
時保留,並且每次都會返回同一對象(靜態局部變量僅初始化一次)。請注意,返回類型mydata()
是一個引用(用&
表示),這意味着當您返回對象時,將返回該對象的引用而不是副本。這使您可以直接訪問函數外部的mydata_instance
對象。
現在,儘管上述方法可行,但擺脫init()
函數並重新設計myData
結構可能不是一個好主意。在這種情況下,只需在結構本身中將someVar
成員設置爲1即可。沒有理由將其初始化爲0的結構裏面隨後必須將其稱之爲init()
將其設置爲1,所以,總體來說:
struct myData
{
int someVar = 1;
int someVar1 = 21;
}
static myData& mydata()
{
static myData mydata_instance;
return mydata_instance;
}
void someFunction1()
{
mydata().someVar = mydata().someVar1;
}
_「我知道了‘MYDATA’指針將只是可以在這個特別的cpp文件「,_不,這是錯誤的。如果你在那裏放置一個「靜態」,那將是真的。另外,在C++中,使用具有私有數據和公共成員函數的類。 – user0042
是的,這將是一個問題。不要創建返回void且不帶參數的函數,也不要在文件範圍創建變量。 –
請不要在C++問題上使用C標籤,它們是不一樣的。 –