2011-08-08 46 views
0

我在Solaris 10框中。 我使用的編譯器是:/opt/solstudio12.2/bin/CC非常簡單編譯在Solaris 10上失敗

編譯下面顯示的文件(myTest2.C)失敗。

% CC -I. -o myTest2 myTest2.C 
"myTest2.C", line 30: Error: "{" expected instead of "myFunc". 
"myTest2.C", line 33: Error: "{" expected instead of "myFunc". 
2 Error(s) detected. 
  1. 爲什麼是錯誤調用myFunc的(),而聲明一個變量?
  2. 是因爲它不在任何功能?
  3. 如何解決它?

僅供參考,我正在寫的字符串obfuscater該經過的C++代碼行,並替換一個引用字符串的(例如:「的myString」)實例與一個函數調用(例如:scrambleString(「myString的」)) 。 myFunc的在這個例子類似於scrambleString


#include <iostream> 
#include <string> 



using namespace std; 


char* myFunc(string inString) 
{ 
    char outString[1024]; 
    int i; 
    for (i = 0; i <= inString.size()-1; i++) 
     outString[i] = inString[i]; 
    outString[i+1] = '\0'; 
    return outString; 
} 



// This Works: 
static char myVariable1 [ ] = "MyString1" ; 

// This Breaks: 
static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30 

// This Breaks: 
char myVariable5 [1024] = myFunc("MyString3"); // Line 
#33 





int main() 
{ 
    // This Works: 
    string Z = myFunc("Gdkkn Vnqkc"); 
    cout << "Z = " << Z << endl << endl;  
} 
+0

什麼是與'爭奪(「MyString的」)'代替「MyString的」的地步?字符串文字仍然在你的代碼中,解密! –

+0

對不起,我在發表該聲明時不清楚/不完整。我應該說以下內容: 僅供參考,我正在寫一個字符串混淆器,它通過C++代碼行並用函數調用替換引用字符串的實例(例如:「myString」)(例如:descrambleString(「ut5ml @de「))。這個例子中的myFunc類似於descrambleString,「ut5ml @ de」是「myString」的混亂版本。 descrambleString()將在運行時將其轉換回原始。 我認爲沒有人會對這些細節感興趣或者他們是相關的。我的錯。 –

回答

3

你的代碼是不是安全的,因爲your're返回堆棧的內容,但除此之外,你返回一個「字符*」 ..您的代碼將編譯(但仍是不安全的,因爲你在堆棧上返回一個指向內容)如果更改簽名:

static char *myVariable = myFunc("foo"); 

話雖這麼說..爲什麼不回,而不是使用字符的字符串對象* ?

+0

+1用於指出未定義的行爲問題並建議使用字符串代替 – Flexo

1

您的代碼

// This Works: 
static char myVariable1 [ ] = "MyString1" ; 

作品,因爲char基礎的文本字符串是char數組。所以你正在用數組初始化一個數組。

接下來的幾行,

// This Breaks: 
static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30 

不工作,因爲你初始化的char陣列與char*指針。數組必須用數組初始化。大括號表示法很常見,這就是你的編譯器抱怨它期望的不是函數調用。

如果你想要的是通過函數調用初始化一些全局字符串變量,那麼考慮使用std::string和/或單例函數。例如,

static std::string& myVariable2() 
{ 
    static std::string theString = myFunc("MyString2"); 
    return theString; // Return a reference to the string instance. 
} 

然而,這是一個技術解決方案,設計不好,所以我只推薦它作爲一個純粹的技術解決目前的問題。

相反,儘量避免全局變量。 。

乾杯&心連心,

1

貴國的功能

char* myFunc(string inString) 
{ 
    char outString[1024]; 
    int i; 
    for (i = 0; i <= inString.size()-1; i++) 
     outString[i] = inString[i]; 
    outString[i+1] = '\0'; 
    return outString; 
} 

有一個錯誤: 您的指針返回到本地變量。函數返回後,outString將超出範圍。不管你將它聲明爲std :: string,你都會遇到麻煩。

2. static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30

這裏myVariable2尺寸沒有在編譯時已知的,所以這將中斷

3. char myVariable5 [1024] = myFunc("MyString3");

這給出錯誤信息爲:

error: array must be initialized with a brace-enclosed initializer, 

我認爲錯誤信息在這種情況下說明了這一切。 您收到的錯誤消息"Error: "{" expected instead of "myFunc". "只是說同一件事的另一種方式。

4.You聲明瞭全局變量是「一般」不是一個好主意