GCCオプション · 1 min read · Jan 22, 2026

あまり知られていないが便利なGCCコマンドラインオプション - パート2

gccコンパイラは、無限に近いコマンドラインオプションのリストを提供します。もちろん、誰もがすべてのオプションを使用したり、専門知識を持っているわけではありませんが、すべてのgccユーザーが知っておくべき、あるいは知っておくべき選択肢がいくつかあります。それらの中には一般的に使用されるものもあれば、あまり一般的ではないが同様に便利なものもあります。

この記事シリーズでは、あまり知られていないが便利なgccコマンドラインオプションのいくつかに焦点を当てており、すでにパート1でいくつかのオプションを取り上げました。

最初のパートの冒頭で、開発者が警告を生成するために一般的に使用する-Wallオプションは、特定の警告をカバーしていないことに言及しました。これらの警告を知らず、どのように有効にするか分からない場合でも心配しないでください。この記事で詳細に説明します。

これに加えて、浮動小数点変数に関連するgccの警告オプションや、gccコマンドラインオプションのリストが大きくなった場合の管理方法についても説明します。

ただし、先に進む前に、このチュートリアルで言及されているすべての例、コマンド、および指示は、Ubuntu 16.04 LTSでテストされており、使用したgccのバージョンは5.4.0です。

** -Wallでカバーされていない警告を有効にする

gccコンパイラの-Wallオプションはほとんどの警告フラグをカバーしていますが、無効のままのものもあります。それらを有効にするには、-Wextraオプションを使用します。

例えば、以下のコードを見てみましょう:

#include   
#include   
int main()  
{  
    int i=0;  
    /* ...  
       ここにコードが入ります   
       ...  
    */  
      
    if(i);  
        return 1;  
     return 0;   
}

私は誤って’if’条件の後にセミコロンを置いてしまいました。次に、以下のgccコマンドを使用してコードをコンパイルしたとき、警告は生成されませんでした。

gcc -Wall test.c -o test

しかし、-Wextraオプションを使用した場合:

gcc -Wall -Wextra test.c -o test

警告が生成されました:

test.c: In function ‘main’:  
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]  
 if(i);

上記の警告から明らかなように、-Wextraオプションは内部的に-Wempty-bodyフラグを有効にし、それが疑わしいコードを検出して警告を発しました。このオプションによって有効にされる警告フラグの完全なリストは以下の通りです:

-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type (Cのみ), -Wold-style-declaration (Cのみ), -Woverride-init, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter (のみ-Wunusedまたは-Wall), および-unused-but-set-parameter (のみ-Wunusedまたは-Wall)。

上記のフラグが何をするのかを学びたい場合は、gccのmanページにアクセスしてください。

次に、-Wextraオプションは以下のケースでも警告を発します:

  • ポインタが整数ゼロと<、<=、>、または>=で比較される
  • (C++のみ) 列挙子と非列挙子が条件式に両方現れる。
  • (C++のみ) 曖昧な仮想基底。
  • (C++のみ) 登録されていると宣言された配列の添字を付ける。
  • (C++のみ) 登録されていると宣言された変数のアドレスを取得する。
  • (C++のみ) 基底クラスが派生クラスのコピーコンストラクタで初期化されていない。

浮動小数点値の等価比較に対する警告を有効にする

ご存知のように、浮動小数点値の正確な等価性をテストするべきではありません(これを知らなかった場合は、浮動小数点比較に関連するFAQをこちらで読むことができます)。しかし、たまたまこれを行った場合、gccコンパイラは警告やエラーを出しますか?確認してみましょう:

以下は、==演算子を使用して浮動小数点変数を比較するコードです:

#include  
  
void compare(float x, float y)  
{  
    if(x == y)  
    {  
        printf("\n EQUAL \n");  
    }  
}  
  
int main(void)  
{  
    compare(1.234, 1.56789);  
   
    return 0;   
}

そして、以下はこのコードをコンパイルするために使用されるgccコマンド(-Wallと-Wextraオプションの両方を含む)です:

gcc -Wall -Wextra test.c -o test

残念ながら、上記のコマンドは浮動小数点比較に関連する警告を生成しません。GCCのmanページをざっと見ると、これらのシナリオで使用すべき専用オプション-Wfloat-equalが存在することがわかります。

このオプションを含むコマンドは以下の通りです:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

そして、以下が生成された出力です:

test.c: In function ‘compare’:  
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]  
 if(x == y)

上記の出力からわかるように、-Wfloat-equalオプションはgccに浮動小数点比較に関連する警告を生成させました。

このオプションについてgccのmanページには次のように書かれています:

このアイデアは、時々プログラマーにとって浮動小数点値を無限に正確な実数の近似として考えることが便利であるということです。これを行う場合、計算が導入する最大またはおそらく最大の誤差を計算し(コードを分析することによって、または他の方法で)、比較を行う際にそれを考慮する必要があります(出力を生成する際にもですが、それは別の問題です)。特に、等価性をテストする代わりに、2つの値の範囲が重なっているかどうかを確認するべきです。これは関係演算子を使用して行われるため、等価比較はおそらく誤りです。

gccコマンドラインオプションをより良く管理する方法

使用しているgccコマンドのコマンドラインオプションのリストが大きくなり、管理が難しくなっている場合は、それをテキストファイルに入れ、そのファイル名をgccコマンドの引数として渡すことができます。これには、@fileコマンドラインオプションを使用する必要があります。

例えば、以下があなたのgccコマンドであるとします:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

次に、3つの警告関連のオプションを’gcc-options’という名前のファイルに入れることができます:

$ cat gcc-options   
-Wall -Wextra -Wfloat-equal

そして、あなたのgccコマンドはより整理され、管理しやすくなります:

gcc @gcc-options test.c -o test

以下はgccのmanページに書かれている@fileについての説明です:

ファイルからコマンドラインオプションを読み取ります。読み取られたオプションは、元の@fileオプションの場所に挿入されます。ファイルが存在しない場合、または読み取れない場合、そのオプションは文字通り扱われ、削除されません。

ファイル内のオプションは空白で区切られています。オプション全体をシングルまたはダブルクォートで囲むことで、空白文字をオプションに含めることができます。任意の文字(バックスラッシュを含む)を含めるには、その文字の前にバックスラッシュを付けます。ファイル自体に追加の@fileオプションが含まれている場合、そのようなオプションは再帰的に処理されます。

結論

このチュートリアルシリーズでは、合計5つのあまり知られていないが便利なgccコマンドラインオプションを取り上げました:-save-temps、-g、-Wextra、-Wfloat-equal、および@file。各オプションを練習する時間を確保し、gccのmanページが提供するすべての詳細を確認することを忘れないでください。

他にこのような便利なgccコマンドラインオプションを知っていたり、世界と共有したい場合は、以下のコメントに詳細を残してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。