2012-09-24 67 views
0

我工作的一個MFC應用程序裏面,我想對在應用程序的所有動作之間共享的全局字符串變量,我做了一個頭文件中的靜態字符串變量但是當我試圖訪問它這裏面的編譯器錯誤出現的行動之一:聲明一個類的靜態成員一個頭文件

error C3381: 'comp' : assembly access specifiers are only available in code compiled with a /clr option 

這是我的頭文件,裏面是類:

//Shared_Variable.h 
class comp 
{ 
comp() { } // private default constructor 
public: 
    static CString myValue; 
}; 

,我用這裏面的一個我的行爲如下:

void CCalculatorDlg::OnBnClickedButton1() 
{ 
comp::myValue="1"; ----->accessing the static member of my class 
LPCTSTR btn_title=_T("1"); 
SetDlgItemText(IDC_EDIT1,btn_title); 

} 

回答

3

乍一看幾個可能性;

  • 您是否在操作代碼文件中包含「Shared_Variable.h」?
  • 是補償在一個命名空間中聲明,並且你需要向下資格,或添加一個using聲明到命名空間?
  • 什麼是CString?我不認爲這是一個C++類型。
  • 如果錯誤信息是有效的,它表明它試圖解釋「補償」作爲保留字。您是否啓用了VC特定的編譯器擴展(或未能禁用與該關鍵字競爭的擴展)?或者,您是否忘記了類定義之上的分號或其他表達式終止符?

另外,在類頭文件中聲明靜態成員需要你有一個.cpp文件來定義該成員的單個實例。所以,你可以聲明它在頭爲:

static CString myValue; 

但你必須內Shared_Variable.cpp做到這一點:

CString comp::myValue; 

沒有這一點,你定義一個靜態變量,但沒有告訴C++哪裏堅持記憶。由於頭文件作爲(可能)多個CPP文件的依賴關係被拉入,您總是必須確保靜態的任何東西都被固定到一個CPP文件,這就是上面的代碼片斷的內容。

的另一種方法,使一個簡單的靜態變量在你的頭文件中聲明:技術上甚至

extern CString myValue; 

,並在相應的CPP文件(CPP的任何文件,真的,它沒有包括頭文件,雖然這是一個好主意):

CString myValue; 

是否有任何幫助?

+0

僅供參考,馬克,CString的是從MS的框架的MFC/ATL字符串。把它看作std :: string/wstring,但是做錯了= P – WhozCraig

+0

啊哈!感謝那。 –

相關問題