1

getopt が int を使用した理由と、getopt での optopt 変数の処理について理解していただければ幸いです。C++ の初心者です。

getopt を見ると、optopt は整数として定義されています。 http://www.gnu.org/software/libtool/manual/libc/Using-Getopt.html#Using-Getopt

ここの例 http://www.gnu.org/software/libtool/manual/libc/Example-of-Getopt.html#Example-of-Getopt

この例で私が理解できない部分は、switch ステートメントで整数を char と比較する方法「c」です。

私が理解しているように、主な引数geoptは機能していますが、文字配列argvであるため、intを返すという事実は奇妙に思えます。私の期待はcharであり、数値引数をintにキャストする必要があります。char は自動的に ANSI コードに変換され、再び変換されますか? printf ステートメント

fprintf (stderr, "Unknown option `-%c'.\n", optopt);

私が理解しているようにcharを期待していますが、intが与えられています。文字配列を扱うときに getopt が int を使用するのはなぜですか?

本当に明らかな何かが欠けていますか?私はしなければならない。

4

1 に答える 1

6

のように整数を文字定数と比較すると、optopt == 'c'実際には文字定数の型は になりintます。実際、C ではcharandshortは二流市民であり、常に in 式に昇格されるため、 ;intを渡したり返したりしても意味がありません。charとにかく昇格intです。

これは C++ の規則とは異なりますが、C++ プログラムでgetoptやなどの C 関数を使用する場合に注意する必要があります。printf

getopt を返すという事実にintは、追加の理由があります。有効なchar値 (通常は 0..255)または-1 を返す可能性があります。charから を取得したい場合はgetopt、最初に -1 の可能性を確認する必要があります。

int i = getopt(argc, argv, option_string);
if (i == -1)
    // no more options
else {
    char c = i;
    // got a valid char, proceed
}

getopt返された場合、有効である可能性がある(-1 または 255 のいずれか) を停止条件charと区別する方法はありません。非常によく似た値のコンテキストでのより良い説明については、このページ(char)(-1)を参照してください。EOF

于 2011-02-23T17:29:09.100 に答える