←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4426

getopt の opterr
投稿者---w(2005/08/12 11:45:29)


OS:Windows XP SP2
コンパイラ:cygwin 版 gcc version 3.4.4

getopt.h を include して、getopt_long 関数を
利用しています。
getopt_long 関数は、
コマンドラインの引数中の文字列を解析し、
見知らぬオプションが来た場合、
標準エラーにエラーを出力する仕様となっています。

ところでそのエラー出力は、
getopt.h 中で extern されている opterr 変数の
フラグを下げることにより抑えることができます。
そこで下に示すようなコードを書いて、
エラー出力を抑えようとしました。

#include <stdio.h>
#include <getopt.h>

opterr = 0;

struct option long_opt[] =
{
   {"output", required_argument, 0, 'o'},
   { 0, 0, 0, 0 }
};

char short_opt[] = {"o:"};

int main (int ac, char **av)
{
   int ch;

   while (1)
   {
      ch = getopt_long(ac, av, short_opt, long_opt, 0);

      switch (ch)
      {
         case -1 :
            printf ("end parse\n");
            goto END_PARSE;

         case 'o' :
            printf ("o option\n");      
            break;
      }
   }

   END_PARSE :
      return (0);
}



コンパイルすると、
4: warning: data definition has no type or storage class
というメッセージが出力されます。
警告なので実行ファイルはできるのですが、
例えば h という想定外のオプションを与えると
標準エラーにエラーを出力しました。

そこで main 関数の中に opterr を移動したところ、
警告は消えました。
さらに、h という想定外のオプションを与えても
標準エラーへのエラー出力がなくなりました。

そのコードを下に示します。

#include <stdio.h>
#include <getopt.h>

//opterr = 0;


struct option long_opt[] =
{
   {"output", required_argument, 0, 'o'},
   { 0, 0, 0, 0 }
};

char short_opt[] = {"o:"};

int main (int ac, char **av)
{
   int ch;
   opterr = 0;

   while (1)
   {
      ch = getopt_long(ac, av, short_opt, long_opt, 0);

      switch (ch)
      {
         case -1 :
            printf ("end parse\n");
            goto END_PARSE;

         case 'o' :
            printf ("o option\n");      
            break;
      }
   }

   END_PARSE :
      return (0);
}



問題は解決したのですが、何が原因で最初の opterr = 0
が効かなかったのか気になっています。

どうかご教授よろしくお願いいたします。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:getopt の opterr 4427 tetrapod 2005/08/12 11:55:25


No.4427

Re:getopt の opterr
投稿者---tetrapod(2005/08/12 11:55:25)


int opterr=0; と書かなきゃならんところを opterr=0; と書いたから。



この投稿にコメントする

削除パスワード

No.4428

Re:getopt の opterr
投稿者---w(2005/08/12 12:06:27)


>int opterr=0; と書かなきゃならんところを opterr=0; と書いたから。

ご回答ありがとうございます。

1つ目のソースコード中で、
int opterr = 0;
としました。

すると先ほどのコンパイルの際の警告は消えました。
ところが、想定外のオプション h を与えたところ、
標準エラーへのエラー出力が出てしまいました。

どうやら opterr のフラグが下がっていないようです。



この投稿にコメントする

削除パスワード

No.4429

Re:getopt の opterr
投稿者---tetrapod(2005/08/12 12:22:30)


GNU getopt をCソースから使う状況であればそもそも
main() の外に opterr=0; を書くのは意味がないです。
それは「実行文」とはみなされない。

getopt.h 中にて extern int opterr; と宣言されていますから、
opterr に対しては main() の外で代入することはできません。

getopt(_long) を使う前に opterr に0を代入するのだから
main() { opterr=0; ... }
とするしか手はないです。

「なぜゆえにそうしなきゃならんか」という疑問に対しては
「Cの文法がそうなっているから」としか答えようがないですね。



この投稿にコメントする

削除パスワード

No.4430

Re:getopt の opterr
投稿者---w(2005/08/12 13:02:05)


昼時にすばやいご回答ありがとうございます。

>getopt.h 中にて extern int opterr; と宣言されていますから、
>opterr に対しては main() の外で代入することはできません。

これは知りませんでした・・・
後ほどC言語の文法の具体的に
どの箇所に明記されているかを調べておきます。

どうもありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity