0

私はSolaris 10ボックスを使用しています。私が使用しているコンパイラは次のとおりです: /opt/solstudio12.2/bin/CC

以下に示すファイル (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. それを回避する方法は?

参考までに、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;    
}
4

3 に答える 3

3

スタックの内容を返しているため、コードは安全ではありませんが、それとは別に、「char *」を返しています..コードはコンパイルされます(ただし、スタック上の内容へのポインターを返すため、安全ではありません)。署名を次のように変更した場合:

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

そうは言っても.. char* を使用する代わりに文字列オブジェクトを返さないのはなぜですか?

于 2011-08-08T21:44:32.220 に答える
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.
}

ただし、これは悪い設計に対する技術的な解決策であるため、現在の問題に対する純粋に技術的な解決策としてのみお勧めします。

代わりに、グローバル変数を避けるようにしてください。

乾杯 & hth.,

于 2011-08-08T21:47:02.810 に答える
1

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;
}

バグがあります: ポインターをローカル変数に返しています。関数が返された後、cariable 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.「一般的に」良い考えではないグローバル変数を宣言しています

于 2011-08-08T23:15:35.130 に答える