2013-02-01 74 views
0

我試圖編寫單元測試中,我們在窗體調用構造函數的泛型類棄用轉換char*。在警告:從字符串常量「ACE_TCHAR *」

warning: deprecated conversion from string constant to ‘ACE_TCHAR*’

上述結果的代碼我也試過:

void testConstructor() { 
    int argc = 2; 
    ACE_TCHAR* argv[2]; 
    argv[0] = "Input1"; 
    argv[1] = "Input2"; 
    MyClass *myClass = new MyClass(argc, argv); 
    /**processing**/ 
} 

導致同樣的錯誤。

我在線閱讀的地方,這可以減輕使用

const ACE_TCHAR* argv[] = {"Input1", "Input2"};

但隨後編譯失敗,因爲函數簽名。

編輯:我不允許修改第三方代碼,我只爲它編寫單元測試。

任何想法?

+1

最明顯的解決方法是使構造帶'const'指針。 – molbdnilo

+0

請勿使用'class'作爲標識符。它是C++中的保留關鍵字。也許使用'klass' –

+0

我們不允許修改第三方提供的src。這個想法超出了我的想法。 –

回答

1

正如名稱所示,字符串常量是常量。所以爲了使警告消失,正確的解決方案的確將是將指針變成一個const指針。

如果不能完成,你可以明確的類型轉換

ACE_TCHAR* argv[] = {const_cast<ACE_TCHAR*>("Input1"), 
        const_cast<ACE_TCHAR*>("Input2")}; 

或指定字符串第一

char input1[] = "Input1"; 
char input2[] = "Input2"; 
ACE_TCHAR* argv[] = {input1, input2}; 
+0

優秀!謝謝先生,我正在尋找什麼。 –

1

類型的字符串字面的非恆定字符數組是「的const char陣列」。通過隱式數組到指針的轉換,您可以使用它來初始化或分配給const char *

但有一個特殊規則,即字符串文字也可以隱式轉換爲char *(不含const)。這個規則存在與舊C代碼兼容,其中char * str = "string literal"是一個常見的習慣用法。使用它是很危險的,因爲通過該指針修改指向字符數組的指針會導致未定義的行爲(即,您的程序可能會崩潰或發生其他任何事情)。出於這個原因,該構造已被棄用,您的編譯器會向您發出警告。

要建立有效的數據,你可以通過對作爲非const字符指針,你可以使用

const int argc = 2; 
ACE_TCHAR argv0[] = "Input1"; 
ACE_TCHAR argv1[] = "Input2"; 
ACE_TCHAR* argv[] = { argv0, argv1 }; 
MyClass *myClass = new MyClass(argc, argv); 
+0

這也是一個很好的答案。感謝您的幫助! –

相關問題