0

const char*strlen に引数として渡された型の C++ の文字列がありますが、void が返されます。

それは次のようになります

strlen(astruct.string);

ありがとう..

編集:いくつかのチェックを行いました、

strlen("test");

それでも無効になります..なぜですか?

編集:ここに画像があります http://img14.imageshack.us/img14/1808/strlen.png

以前はわかりづらくてすみません。フォーマットがうまくいきませんでした。とにかく、混乱は Evan Teran と Vlad Romascanu の両方によって解決されました。Brian R. Bondy の回答もご覧ください。

ありがとう。気軽に閉めてください。

4

6 に答える 6

6

Visual Studio 6.0 の安っぽいデバッガーに混乱しています。これに頼らないでください。インライン化などにより、戻り値を取得できなかった可能性があります。

値を出力して、実際の値を取得します。

編集:また、あなたの例から、とにかく strlen の結果を保存していないようです。これも、デバッガーが戻り値を認識しない理由である可能性があります。値を使用していない場合、strlen を実際に実行する必要はないとコンパイラが判断した可能性は十分にあります。

注: この時点で、まだVC++ 6.0 を使用する正当な理由はありません。これは古いコンパイラであり、非常に貧弱な C++ コンパイラである IDE です。ビジュアル C++ コンパイラの新しいバージョンは無料 (IDE なし) です。使用してください。

于 2009-02-23T03:19:22.407 に答える
4

strlen は戻り型 void ではありません。正しいメッセージを表示していないのはデバッガです。

デバッガーが無効を示しているのはなぜですか?

使用している strlen の実装は、おそらく #define strlen someothername_strlen にラップされています。

デバッガーはおそらく #define を適切にサポートしていないか、関数のその他の修飾子をサポートしていません。

iLen = strlen("test") のようなことをしてから、時計で iLen を確認する必要があります。

通常、時計で関数を呼び出すことができます。たとえば、次の関数を定義して、ウォッチで呼び出してみてください。

int testFunc(char*)
{
  return 5;
}

その結果、時計に 5 が表示される可能性があります。

于 2009-02-23T03:11:57.107 に答える
3

スクリーン ショットを参照してください。デバッガーは、実際にはエラーを表示する必要があるときに表示<void>されます。strlen(...)

メソッドを呼び出して、その結果をデバッガー ウォッチに表示することはできません。デバッガーは、既存の変数とデータのみを表示します。メソッドは、コードの作成者もデバッガも予期していなかった方法でデバッグ中のプログラムの状態を変更できるため、必要に応じて任意のメソッドを呼び出すことはできません。

あなたができることは、コードに一時的に追加することです:

size_t tmp_len = strlen(struc.string);

次にコンパイルして、tmp_len をウォッチに追加します。

于 2009-02-23T03:00:02.423 に答える
0

strlen は整数を返すので、「0」を返すという意味だと思います。

また、データ型を指定する方法では、それが const char * なのか const char ** なのかわかりません。後者の場合は、** を単一の * に逆参照していることを確認する必要があります。

私の推測では、文字列は null バイトで始まるため、0 が返されます。

于 2009-02-23T02:57:53.693 に答える
0

C++ では、関数は常に、返すように宣言されている型の値を返します。関数宣言は次のようになりstrlenます。

size_t strlen(const char *);

返すことができる唯一のものはsize_t. コンパイラは、コンパイル時にこの情報を使用して、関数を呼び出すときに戻り値を処理する方法を決定します。ここでのポイントは、strlen関数が上記のように宣言されている場合、void時には型の値を返したり、型の値を返したりすることを決定できないということsize_tです。

これは一般に、C++ のような静的に型付けされた言語の特徴です。動的型付け言語 (Perl、Python、Ruby、PHP など) では、関数は呼び出されるたびに任意の型の値を返すことを決定できます。

于 2009-02-23T03:45:19.427 に答える
-2

void を返すことはできません。Void は戻り値がないことを意味するため、エラーを返すことはできません。

とにかくボイドをどのようにチェックしますか?Void は値ではありません。どのように無効になっているのかを示してください。コンパイル時ですか、それとも実行時ですか?

strlen実際に戻り値の型で宣言されているシステムがある場合voidは、反対方向にできるだけ速く実行してください。

于 2009-02-23T03:04:05.067 に答える