プリプロセッサ関連のオプションの補足

-Wunused-macros

 このオプションを使うと,ソース中に使用していないマクロがあった場合に警告します(リスト1).

〔リスト1〕マクロが未使用の場合警告する例(test165.c)
/*
 *使用していないマクロに警告する
 */
#include <stdio.h>
#define max(a,b) ((a) >? (b)) 
int main(void)
{
    long    b;
    printf("test165\n");
    return  0;
}

 コンパイルの結果を以下に示します.

  $gcc -Wunused-macros test165.c
  test165.c:5:1: 警告: macro"max"is not used
  $gcc test165.c
  $

-Wendif-labels

 このオプションを使うと,プリプロセッサ文中の意味のないテキストに警告します(リスト2).

〔リスト2〕プリプロセッサ文中の意味のないテキストに警告する例 test166.c)
/*
 *else,endifの後のテキストに警告する
 */
#include <stdio.h>
#if TEST166
    long    a1  =0;
#else TEST166
    long    a1  =1000;
#endif TEST166
#if TEST166a
    long    a2  =0;
#else
    long    a2  =1000;
#endif
int main(void)
{
    long    b;
    printf("test166\n");
    return  0;
}

 コンパイルの結果を次に示します.

  $gcc-Wendif-labels test166.c
  test166.c:7:7: 警告:
  余分なトークンが #elseディレクティブの終りにあります
  test166.c:9:8: 警告:
  余分なトークンが#endifディレクティブの終りにあります
  $

 なお,このオプションはデフォルトで使われます.

  $gcc test166.c
  test166.c:7:7: 警告:
  余分なトークンが #elseディレクティブの終りにあります
  test166.c:9:8: 警告:
  余分なトークンが#endifディレクティブの終りにあります
  $

-CC

 マクロを展開する際に,コメントをマクロ展開リストに出力するか否か指定します(リスト3).

〔リスト3〕マクロ展開リスト中のコメントを有効にする例 test167.c)
/*
 *マクロ中のコメントを有効にする
 */
#include <stdio.h>
#if TEST167
    long    a1  =0; //test
#else
    long    a1  =1000;  //コメント
    long    b1  =1000;  /*test*/
#endif
int main(void)
{
    long    b;
    printf("test167\n");
    return  0;
}

 コンパイル(マクロ展開)の結果を以下に示します.

  $gcc -CC -E test167.c|grep [ab]1
   long a1=1000; //コメント
   long b1=1000; /*test*/
  $gcc -E test167.c|grep [ab]1
   long a1=1000;
   long b1=1000;
  $

 オプション-Eは,前処理のリストを標準出力に出力するものです.-CC単独では何もしません.

-###

 -vオプションと同様にバージョンを表示します.

-x language

 いくつかの言語を混在させてコンパイルを行う際に,次の-xオプションまでlanguageとして扱うオプションです.しかし*.cや*.sと接尾語でそのソースが何かを確定させるほうが効率的です.

-x none

 このオプションを指定すると,-x languageで指定した言語を無視し,接尾語で確定した言語として扱います.

-pass-exit-codes

 通常はgccコマンドでコンパイル・リンク中にエラーコード1を戻したところで終了してしまいます.このオプションを指定すると,最後まで実行します.ただしコンパイル・リンクエラーより,もっと重要な異常が起きた場合には終了してしまいます.

-Dマクロ名

 このオプションに続いてマクロ名を指定すると,それは1と定義されます(リスト4).

〔リスト4〕-Dオプションの例test174.c)
/*
 *-Dオプションの例
 */
#include <stdio.h>
int main(void)
{
#if dbg
    printf("デバッグ中\n");
#else
    printf("βテスト中\n");
#endif
    return  0;
}

 コンパイルと実行の結果を以下に示します.

  $gcc test174.c -o test174
  $ ./test174
  βテスト中
  $gcc -D dbg test174.c -o test174
  $ ./test174
  デバッグ中
  $

 2回目のコンパイル・実行ではdbgが1と定義されたため“デバッグ中”と出力するコードをコンパイルしました.

-Dマクロ名=値

 このオプションでマクロに値を設定できます(リスト5).

〔リスト5〕-Dオプションでマクロに値を設定する例test175.c)
/*
 *Uオプションでマクロを設定する例
 */
#include <stdio.h>
int main(void)
{
    printf("macro_01の値は%d\n",macro_01);
    printf("macro_02の値は%d\n",macro_02);
    return  0;
}

 コンパイルと実行の結果を以下に示します.

  $gcc -D macro_01="58548" -D macro_02
=“152635” test175.c -o test175
  $ ./test175
  macro_01の値は58548
  macro_02の値は152635

  $

-Uマクロ名

 通常は__GNUC__という名前がspecsによって初期設定されています.これはGCCのメジャーバージョンなので,この環境では3です.これを-U __GNUC__とオプションで指定した場合,__GNUC__の定義が無効になります(リスト6).

〔リスト6〕Uオプションでマクロ設定を取り消す例test176.c)
/*
 *Uオプションでマクロ設定を取り消す例
 */
#include <stdio.h>
int	main(void)
{
#if	__GNUC__
	printf("__GNUC__は有効\n");
#else
	printf("__GNUC__は無効\n");
#endif
	return	0;
}

 コンパイルと実行の結果を以下に示します.

  $gcc -U __GNUC__ test176.c -o test176
  $ ./test176
  __GNUC__は無効
  $gcc test176.c -o test176
  $ ./test176
  __GNUC__は有効
  $

-A predicate=answer

 このオプションはプログラム中の条件に値を与えることができます.条件コンパイルなどに使用することができます(リスト7).

〔リストリスト7〕-Aオプションでpredicateとanswerを設定する例test177.c)
/*
 *-Aオプションでpredicate と answerを設定する例
 */
#include <stdio.h>
int main(void)
{
#if #pre (test)
    printf("predicate test \n");
#else
    printf("predicate answerは定義されていません\n");
#endif
    return  0;
}

 コンパイルと実行の結果を以下に示します.

  $gcc -A predicate=test test178.c -o test177
  $ ./test177
  predicate test
  $gcc test177.c -o test177
  $ ./test177
  predicate answerは定義されていません
  $

-A-predicate=answer

 上で説明したオプションの逆の意味をもちます.プログラム中の条件の値を取り消します.これはspecsファイルなどに初期設定されているものを解除するときなどに使います.

 以上のプリプロセッサ関連(全般にかかわるオプション)のまとめを表3に示します.

〔表3〕プリプロセッサ関連(全般にかかわるオプション)のまとめ

Copyright 2003 岸 哲夫

Copyright 1997-2017 CQ Publishing Co.,Ltd.

 

NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
GCC3.3をインストールする方法/C言語の方言を扱うオプション の補足/LINK関連のオプションの補足
◆プリプロセッサ関連のオプションの補足
警告を要求/抑止する オプションの補足