2017-01-29 109 views
-2

我需要在包含一系列全局變量的多個CPP文件中包含頭文件。但我遇到的問題是,我似乎不能使變量可以修改。我可以在頭文件或任何cpp文件中初始化變量,但是當我改變它時,它將不會編譯或創建超出一個和另一個範圍的變量的2個實例。我需要一種方法可以讓我改變函數中的值。使用可修改的全局變量C++

例靜態的(它創建其他變量的範圍變量的實例)

#pragma once 

namespace SCE 
{ 
static bool SC_DEBUG = false; 
static bool VSYNC = true; 
static int SC_LOG_LEVEL = 3; 
} 

香港專業教育學院還利用「的extern」試過,但我要麼不得不與沒有運氣。

#pragma once 

namespace SCE 
{ 
    extern bool SC_DEBUG; 
    extern bool VSYNC; 
    extern int SC_LOG_LEVEL; 
} 

編輯 我得到的錯誤 「錯誤LNK2001:無法解析的外部符號 」布爾SCE :: VSYNC「(?VSYNC @ SCE @@ 3_NA)」,當我嘗試和編輯變量一旦創建它使用extern。我嘗試和編輯它的方式是像這樣

int main() 
{ 
    SCE::VSYNC = false; 
    // ... 
} 

解決方案 我使用的是多項目的設置。因此,發生的事情是'項目B'包含全局變量頭文件和cpp,而'項目A'正試圖在設置後更改該值。現在出於某種原因,因爲'項目A'只是拉動全局變量頭文件,所以它獲取變量定義但是看不到變量的初始化,從而拋出一些奇怪的錯誤。

回答

0

在頭文件中定義的變量與extern

// globals.h 
namespace SCE 
{ 
    extern bool SC_DEBUG; 
    extern bool VSYNC; 
    extern int SC_LOG_LEVEL; 
} 

而且在實現文件中定義它們:

// globals.cpp 
namespace SCE 
{ 
    bool SC_DEBUG = false; 
    bool VSYNC = true; 
    int SC_LOG_LEVEL = 3; 
} 

現在你可以包含頭文件到您的其他文件。

+0

這不是我有問題,我可以精細創建它們,但是當涉及到編輯它們,我得到的錯誤錯誤LNK2001:無法解析的外部符號「布爾SCE :: VSYNC「(?VSYNC @ SCE @@ 3_NA) – 0xen

+0

@ 0xen您是否已將所有文件包含到項目中?如果不包含'globals.cpp',則會出現該錯誤。 –

+0

是的,它編譯並運行良好,當我不嘗試編輯如上所示在我的編輯變量。 – 0xen

0

你的問題不太清楚。看來你正面臨着靜態變量的問題。即使靜態變量超出範圍,它們也能夠保留它們的值。在程序運行之前,它們一直在內存中。例如。

#include<stdio.h> 
static int i = 0; 
int fun() 
{ 
    i= i+5; 
} 

int main() 
{ 
    fun(); 
    printf("%d ", i); 
    i= 10, 
    printf("%d ", i); 
    return 0; 
} 

輸出:5 10