2

以下のコードスニペットでは、char*をconstchar *に置き換え、strdup()関数呼び出しを削除して、getopt()によって設定されたoptarg値を直接取得できますか?strdup関数の使用をスキップするには、constchar*を使用することをお勧めします。事前に助けに感謝します。

/* Code Snippet */
char *dir = NULL; 
char *bld = NULL;
int chr;

while ( ( chr = getopt( argc, argv, "d:a:b:f:" ) ) != -1 ) {

 switch ( chr ) {

  case 'd': //Directory parameter
   dir = strdup( optarg );
   if (dir == NULL) { /*Error*/ }

  case 'b': //Build parameter
   bld = strdup( optarg );
   if (bld == NULL) { /*Error*/ }
  ...other code...
 }
} 

私はそうする必要性を本当に理解していません。

編集:答えてくれてありがとう。本当に助かりました。コードをconstchar*に変更し、strdup呼び出しをスキップしました。

ありがとう、Liju

4

3 に答える 3

2

( http://linux.die.net/man/3/optarg )からの私の理解は、optargがargvバッファーの内容を指しているので、strdupは必要ないということです。constchar*を使用するという提案は合理的な考えのようです。

于 2008-10-30T12:27:43.807 に答える
2

どちらも良いアドバイスです。おそらく dir と bld を変更したくないので、それらを char * の代わりに const char * として宣言すると、コンパイラーがより多くのコーディング エラーを検出するため、いずれの場合にも役立ちます。strdup を取り除くことで、(後で dir をどうするかにもよりますが) 不要なコピーを避けるだけですが、optarg へのエイリアスが作成されます。

于 2008-10-30T23:18:05.227 に答える
2

optarg は ' ' として宣言されextern char *optarg;ているため、' ' を使用する必要はありませんがconst char *、プログラムの引数を変更しないことをお勧めします。dirそれは、変数とbld変数で呼び出す関数が const で正しいかどうかにさらに依存することをお勧めします。それらがあなたのコードであれば、そうすることができます。そうでない場合は、変数を非 const にしておく方が簡単な場合があります。' ' への呼び出しstrdup()(POSIX では標準ですが、C では標準ではありません - ISO/IEC 9899:1999 のように) は不要です。

于 2008-10-30T23:07:48.320 に答える