-2

私は次のように機能を遅らせるサードパーティのライブラリを持っています:

void foo(const void* input, char output[1024]);

このようなものを書くと:

char* input = "Hello";
char  output[1024];
foo(input, output); // OK

しかし、スタック上でそのような大きな配列を宣言したくありません (OS カーネル環境では非常に危険です)。だから私はこのようなことをしなければなりません:

char* input      = "Hello";
char* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664

foo の実装を変更することはできません。どうすればいいですか?

=================

問題は解決しました。私の実際のコードは次のようなものです:

char* input      = "Hello";
void* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664

void* から char* への変換は、標準では暗黙的に受け入れられません。したがって、次のコードが機能します。

char* input      = "Hello";
void* output_buf = new char[1024];
foo(input, (char*)output_buf); // OK
4

2 に答える 2

3

C++ では、配列型の関数引数は実際にはポインター型と見なされるため、これは奇妙です。つまり、コンパイラによって見られる「実際の」関数シグネチャは

void foo(const void* input, char* output);

各パラメーターの型を決定した後、「T の配列」型 [...] の任意のパラメーターは「T へのポインター」になるように調整されます (C++11、[dcl.fct]、¶5)。

最も重要なことは、ここでわかるように、コード機能することです。あなたの「絞り込まれた」例が実際にあなたが見ている問題を反映していると確信していますか? おそらく問題は、別のパラメーターの型にあります。

于 2012-12-16T17:13:16.673 に答える
2

問題はありませんoutput。実際には、関数に配列を渡すことができないため、関数は配列を取りません。charへのポインタを受け取ります。これも同様に機能します:

void foo(char f[1024])
{
    // blah
}

int main() {
    char c1[1];
    foo(c1);  // works!

    char *c2 = new char[27];
    foo(c2);  // works!

    delete [] c2; 
}

そのコードはコンパイルされます。これは、関数がポインターを受け取るためです。それだけです。したがって、問題は最初の引数にありinputます。タイプが間違っているはずです。エラー メッセージを詳しく調べるか、または の宣言を表示してくださいinput

于 2012-12-16T17:13:42.097 に答える