「プリプロセス」とは,ソースプログラムに対してコンパイル前に行われる前処理のことです.
前回説明したように,コンパイルのプロセスは,前処理・コンパイル・アセンブル・リンクとなりますが,その前処理を行うプログラムを「プリプロセッサ」と呼びます.
オプションの説明に入る前に,プリプロセッサの簡単な使い方を説明します.
まずよく使われるのは,ヘッダファイルの管理です.ヘッダファイルを二重に読み込んで前処理しないために,以下のような使い方をします.
#ifndef _STDIO_H
#define _STDIO_H
//ヘッダファイルstdio.hの中身
#endif
実際に/usr/includeの下にあるstdio.hを見るとわかりますが,ヘッダファイル全体を#ifndef文と#endifで囲います.これで間違ってstdio.hが2回#includeされても,すでにその名前が#defineされているので#ifndef文と#endif文で囲った部分が無視されます.
次に,#define文について説明します.これは「マクロ定義」そのものです.
#define data_max 100
上記のdefineマクロではdata_maxを100であると定義しています.これ以降のソースでdata_maxは100に置き換えられて前処理され,コンパイルされます.リスト1はその例です.
〔リスト1〕defineマクロの検証(test27.c)
|
#include <stdio.h>
#define DATA_MAX 100
#define CONST_STR "このソースはtest27.cです\n"
#include <stdlib.h>
int main(int argc, char* argv[])
{
printf("DATA_MAXの100倍は%dです\n",DATA_MAX*100);
printf(CONST_STR);
return 0;
}
|
|
実行結果は以下のようになります.
$ gcc test27.c
$ ./a.out
DATA_MAXの100倍は10000です
$
また#define文は,関数的な処理ができるマクロを作成することも可能です.同じような式がたくさんソース中に現れるときに可読性を高めることができます.リスト2がその例です.
〔リスト2〕関数的な処理ができるマクロ検証(test28.c)
|
#include <stdio.h>
#define _MY_DEBUG(x) printf("値は%dです\n",x);
int main(int argc, char* argv[])
{
int i;
for(i=0;i<1000;i++)
{
if (i==100) _MY_DEBUG(i)
if (i==500) _MY_DEBUG(i)
}
return 0;
}
|
|
実行結果は,以下のようになります.
$ gcc test28.c
$ ./a.out
値は100です
値は500です
$
このソースを前回で説明したように,コンパイル時の-Eオプションで前処理されたソースコードを表示すると,以下のようになっています.
int main(int argc, char* argv[])
{
int i;

for(i=0;i<1000;i++)
{

if (i==100) printf("値は%dです\n", i );

if (i==500) printf("値は%dです\n", i );
}
return 0;
}
なお,定義済みマクロなどプリプロセッサの処理についての奥深い検証は,また別に「プリプロセッサ」そのものの説明として別に設けます.
次に#include文について説明します.リスト2を例に説明します.
printfなどの標準ライブラリ関数を実行するためには,ヘッダであるstdio.hをソース中に読み込ませなくてはなりません.そこで,
#include <stdio.h>
と記述し,ソース中にstdio.hを読み込ませて前処理を行い,コンパイルを行うわけです.
次に,#if文について説明します.これは#endifと組にして使用します.この二つで囲まれた文にコンパイルの際,影響を及ぼします.
#ifの後にある式が真の場合,#if〜#endifの間はコンパイルされます.逆に偽の場合にはコンパイルされません.たとえば#if 0〜#endifに囲まれた文は,コメントアウトしたことと同等に扱われます.また,制御文のelseのように#else文が,そしてelse ifの意味で#elif文を使用して#ifの入れ子を作ることもできます.
次に#ifdef文について説明します.
これは#if文と同じように#else文,#endif文が使用できます.違うのは,#ifdefの後にマクロ名を指定する点です.そのマクロが定義されていれば,#ifdef〜#endifの間はコンパイルされます.
その逆は#ifndef文です.そのマクロが定義されていれば,#ifndef〜#endifの間はコンパイルされません.
この#define,#include,#ifなどの命令をプリプロセッサディレクティブと呼びます.ほかにもプリプロセッサディレクティブがありますが,ここでは割愛し,プリプロセッサを説明する回で詳細に検証します.
では,実際のプリプロセッサオプションについて説明と検証を行います.
● -E
このオプションを使うと,前処理以外には何も実行されません.ここに挙げたオプションの中には,-Eオプションとともに使わなければ意味をなさないものがいくつかあります.そのようなオプションを指定した場合,プリプロセッサの出力が実際の処理には不適切なものになるからです.
● -include file
通常の入力ファイルを処理する前に,fileにより指定されるファイルを入力として処理します.つまりfileの内容が最初に前処理またはコンパイルされることになります.コマンドライン上にある-Dオプションと-Uオプション(後述)は,それらが指定された順序に関係なく,常に-include fileよりも前に処理されます.すべての-includeオプションと-imacrosオプション(後述)は,指定された順序に処理されます.
使用例として,次のようなことができます.
デバッグ用のマクロおよびデバッグ用の関数を有効にしてコンパイルしたいときは,-include debug_proc.hと指定すれば,デバッグ用のマクロおよびデバッグ用関数が含まれるソースであるdebug_proc.hを有効にしてコンパイルまたは前処理することが可能です.
● -imacros file
通常の入力ファイルを処理する前に,fileにより指定されるファイルを入力として処理しますが,その出力結果は破棄します.file中のプリプロセッサディレクティブのみを有効に扱うので,fileの中で定義されているマクロを主要な入力ファイルの中で有効にできます.
コマンドライン上にある-Dオプションと-Uオプション(後述)は,それらが指定された順序に関係なく,常に-imacros fileよりも前に処理されます.すべての-includeオプション(前述)と-imacrosオプションは,指定された順序に処理されます.
使用例として,次のようなことができます.
前項で例に挙げたデバッグ用のマクロおよびデバッグ用の関数が含まれるソースの中で,デバッグ用のマクロだけを有効にして,かつデバッグ用の関数を無効にしてコンパイルしたいときに使用することが可能です.
● -idirafter dir
ディレクトリdirを第2のインクルードパスに追加します.第2のインクルードパスに含まれるディレクトリは,あるヘッダファイルがメインインクルードパス〔-Iオプション(後述)はここにディレクトリを追加する〕に含まれるどのディレクトリの中にも見つからない場合に探索されます.
使用例として,次のようなことができます.ディレクトリが別で名称が同一のヘッダファイルを使用したいときに,このオプションを指定して意図的にインクルードされるヘッダファイルを変えることが可能です.
● -iprefix prefix
後続の-iwithprefixオプションのための接頭語としてprefixを指定します.
● -iwithprefix dir
ディレクトリを第2のインクルードパスに追加します.ディレクトリの名前は,事前に-iprefixにより指定された接頭語prefixとdirを連結することによって作られます.接頭語が事前に指定されていない場合には,コンパイラがインストールされたディレクトリがデフォルトの接頭語として使われます.
使用例として,次のようなことができます.
-iprefix /home/dareka/と指定し,-iwithprefix debugと記述した場合,第2のインクルードパスは/home/dareka/debugとなります.-iwithprefix releaseと記述した場合,第2のインクルードパスは/usr/home/dareka/releaseとなります.このようにオプションを指定して,意図的にインクルードされるヘッダファイルを変えることが可能です.リスト3はその例です.
〔リスト3〕インクルードパスの変更オプション(test29.c)
|
#include <test.h>
int main(int argc, char* argv[])
{
int i;
for(i=0;i<1000;i++)
{
if (i==100) _MY_DEBUG(i)
if (i==500) _MY_DEBUG(i)
}
return 0;
}
|
|
この例ではホームディレクトリ(/home/dareka)の下に二つのディレクトリtestdir1,testdir2を作成します.その下にそれぞれ内容の違うヘッダファイルtest.h(リスト4,リスト5)を置いています.
〔リスト4〕testdir1にあるヘッダファイル(testdir1/test.h)
|
#define _MY_DEBUG(x) printf("[testdir1のヘッダ]値は%dです\n",x);
|
|
〔リスト5〕testdir2にあるヘッダファイル(testdir2/test.h)
|
#define _MY_DEBUG(x) printf("[testdir2のヘッダ]値は%dです\n",x);
|
|
実行結果は以下のようになります.
$ gcc -iprefix /home/dareka/ -iwithprefix testdir1 test29.c
$ ./a.out
[testdir1のヘッダ]値は100です
[testdir1のヘッダ]値は500です
$ gcc -iprefix /home/dareka/ -iwithprefix testdir2 test29.c
$ ./a.out
[testdir2のヘッダ]値は100です
[testdir2のヘッダ]値は500です
$
● -iwithprefixbefore dir
メインインクルードパスにディレクトリを追加します.前項目と同様に,ディレクトリの名前はprefixとdirを連結することによって作られます.
● -isystem dir
ディレクトリを第2のインクルードパスの先頭に追加し,標準のシステムディレクトリと同等の特殊な取り扱いを受けられるようにします.
● -nostdinc
ヘッダファイルを探す際,標準のシステムディレクトリを探索せず,-Iオプション(後述)により指定されたディレクトリだけを探索します.-Iオプションに関する説明は,ディレクトリ探索のためのオプションを説明するときに合わせて行います.
-nostdincと-Iを両方使用することにより,インクルードファイルの探索パスを,明示的に指定したディレクトリだけに限定することができます.ヘッダファイルだけを変更してコンパイルする場合に有効です.
● -undef
非標準のマクロを事前定義しません.非標準のマクロとは基本的にマクロ名の前後にアンダスコアが2個ずつ付いたものです.たとえば使用しているマシンのプロセッサを表すマクロは非標準です.
● -E
Cプリプロセッサだけを実行します.指定されたすべてのCソースファイルを前処理して,その結果を標準出力,もしくは指定された出力ファイルに出力します.
$ gcc -E test28.c > list30.txt
上記のように打鍵した場合に,list30.txtはリスト6のようになります.少し長いですが参考に見てください.
〔リスト6〕-Eオプションの結果(list30.txt)
|
|
● -C
プリプロセッサに対して,インクルードしたヘッダファイルなどのコメントを破棄しないよう指示します.もちろん-Eオプションとともに使います.
$ gcc -E -C test28.c > list31.txt
上記のように打鍵した場合,list31.txtはリスト7のようになります.これは長いので,少し省略しました.
〔リスト7〕-E -C オプションの結果(list31.txt)
|
|
● -P
プリプロセッサに対して#line指示子を生成しないよう指示します.-Eオプションとともに使います.つまり,インクルード情報を省略してヘッダファイルの実際の定義を見たいときに有用な方法です.
$ gcc -E -P test28.c > list32.txt
上記のように打鍵した場合,list32.txtはリスト8のようになります.
〔リスト8〕-E -P オプションの結果(list32.txt)
|
|
● -M
プリプロセッサに対して,個々のオブジェクトファイルの依存関係を記述したルール情報を出力するよう指示します.makefileを作成または確認するために必要なオプションです.
ルールの一覧は,前処理されたCプログラムの中にではなく,標準出力に表示されます.-Mは,暗黙のうちに-Eを指定します.
makeルールを出力するように指定する別の方法に,環境変数DEPENDENCIES_OUTPUTを設定する方法があります.
$ gcc -E -P test28.c > list33.txt
上記のように打鍵した場合,list33.txtはリスト9のようになります.
〔リスト9〕-Mオプションの結果(list33.txt)
|
test28.o: test28.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
/usr/include/bits/sched.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stdarg.h \
/usr/include/bits/stdio_lim.h
|
|
● -MM
-Mと似ていますが,出力の中には#include文により取り込まれたユーザーヘッダファイルだけが記述されます.よって,#include <file>により取り込まれたシステムヘッダファイルは除外されます.
● -MD
-Mと似ていますが,依存関係の情報は,入力ファイル名の末尾の“.c”を“.d”に置き換えた名前のファイルに書き込まれます.指定されたファイルはコンパイルされます.
● -MMD
-MDと似ていますが,ユーザーヘッダファイルだけが対象となります.
● -MG
見つからないヘッダファイルは生成されるファイルとして取り扱い,ソースファイルと同じディレクトリに存在するものと想定します.-MGを指定する場合には,-Mか-MMのいずれかをあわせて指定しなければなりません.-MDや-MMDが指定されている場合には矛盾するため,-MGは無視されます.
● -H
通常の処理に加えて,ソース中で明示的または暗黙に使用されるヘッダファイルの名前をすべて表示します.
実行結果はリスト10のようになります.
〔リスト10〕est28.cで使用されるヘッダファイル
|
$ gcc -H test28.c >
/usr/include/stdio.h
/usr/include/features.h
/usr/include/sys/cdefs.h
/usr/include/gnu/stubs.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h
/usr/include/bits/types.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h
/usr/include/bits/pthreadtypes.h
/usr/include/bits/sched.h
/usr/include/libio.h
/usr/include/_G_config.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h
/usr/include/wchar.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h
/usr/include/bits/wchar.h
/usr/include/gconv.h
/usr/include/wchar.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stddef.h
/usr/lib/gcc-lib/i586-pc-linux/2.95.3/include/stdarg.h
/usr/include/bits/stdio_lim.h
$ h
|
|
● -A question(answer)
#if #question(answer)のような前処理の条件式でテストされる場合に備えて,questionに対する答answerを診断します.-Aはすべての事前定義条件を使用不可とします.
● -Dmacro
マクロmacroを文字列1として定義します.
● -Dmacro=hoge
マクロmacroをhogeとして定義します.コマンドライン上にあるすべての-Dオプションは,どの-Uオプションよりも前に処理されます.
● -Umacro
マクロmacroの定義を取り消します.-Uオプションは,すべての-Dオプションの評価が終わったあとで評価されますが,どの-includeオプションや-imacrosオプションよりも前に評価されます.
上記のマクロ関連オプションを設定してリスト11をコンパイル/実行すると,以下のようになります.
〔リスト11〕マクロ関連オプションの検証用ソース(test30.c)
|
#include <stdio.h>
#ifndef TESTMACRO
#define TESTMACRO 0
#endif
int main(int argc, char* argv[])
{
printf("%d\n",TESTMACRO);
return 0;
}
|
|
$ gcc -DTESTMACRO test30.c
$ ./a.out
1
$ gcc -DTESTMACRO=120 test30.c
$ ./a.out
120
$ gcc -UTESTMACRO test30.c
$ ./a.out
0
$
● -dM
プリプロセッサに対して,前処理の終了時点において有効なマクロ定義の一覧を出力するよう指示します.-Eオプションとともに使います.
$ gcc -E -dM test30.c > list34.txt
$
上記のように打鍵した場合,list34.txtはリスト12のようになります.
〔リスト12〕-dMオプションの結果(list34.txt)
|
#define _WINT_T
#define _IO_LEFT 02
#define __linux__ 1
#define _IO_DELETE_DONT_CLOSE 0x40
#define _IO_UPPERCASE 01000
#define _IO_NO_READS 4
#define _IO_STDIO 040000
#define _IO_file_flags _flags
#define _IO_off64_t _G_off64_t
#define _IO_MAGIC_MASK 0xFFFF0000
#define EOF (-1)
#define _IO_INTERNAL 010
#define __ptr_t void *
#define _G_stat64 stat64
#define BUFSIZ _IO_BUFSIZ
#define _IO_SCIENTIFIC 04000
#define _IO_getc_unlocked(_fp) ((_fp)->_IO_read_ptr >=
(_fp)->_IO_read_end ? __uflow (_fp) : *(unsigned char *) (_fp)
->_IO_read_ptr++)
#define _G_ssize_t __ssize_t
#define _IO_STDIO_H
#define _POSIX_C_SOURCE 199506L
#define _OLD_STDIO_MAGIC 0xFABC0000
#define _IO_MAGIC 0xFBAD0000
#define ____FILE_defined 1
#define _IO_UNBUFFERED 2
#define _IO_SHOWBASE 0200
#define L_tmpnam 20
#define __stub_revoke
#define L_cuserid 9
#define __USE_MISC 1
#define SEEK_END 2
#define _G_BUFSIZ 8192
#define SEEK_CUR 1
#define __GLIBC__ 2
#define _IO_getwc_unlocked(_fp) ((_fp)->_wide_data->_IO_read_ptr >=
(_fp)->_wide_data->_IO_read_end ? __wuflow (_fp) : (_IO_wint_t) *(_fp)
->_wide_data->_IO_read_ptr++)
#define __STDC_ISO_10646__ 200009L
#define _SYS_SIZE_T_H
#define linux 1
#define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE
#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
#define __stub_posix_fadvise
#define _G_VTABLE_LABEL_PREFIX "__vt_"
#define _IOS_ATEND 4
#define _FEATURES_H 1
#define _G_config_h 1
#define __i386__ 1
#define __INT_WCHAR_T_H
#define _IO_pos_t _G_fpos_t
#define __mbstate_t_defined 1
#define _G_NAMES_HAVE_UNDERSCORE 0
#define __UNKNOWN_10646_CHAR ((wchar_t) 0xfffd)
#define TESTMACRO 0
#define _G_size_t size_t
#define __FILE_defined 1
#define __attribute_pure__
#define stderr stderr
#define _IO_BUFSIZ _G_BUFSIZ
#define _IO_flockfile(_fp)
#define __WCHAR_T
#define __i386 1
#define __HAVE_COLUMN
#define getc(_fp) _IO_getc (_fp)
#define _IO_TIED_PUT_GET 0x400
#define __ptrvalue
#define __i586 1
#define _IO_ERR_SEEN 0x20
#define _IOS_NOREPLACE 64
#define SEEK_SET 0
#define _IO_cleanup_region_end(_Doit)
#define _IO_funlockfile(_fp)
#define _IO_iconv_t _G_iconv_t
#define _IO_size_t _G_size_t
#define ___int_size_t_h
#define _IOFBF 0
#define __unbounded
#define _G_VTABLE_LABEL_PREFIX_ID __vt_
#define _G_HAVE_IO_FILE_OPEN 1
#define _G_USING_THUNKS 1
#define stdout stdout
#define __GNUC_MINOR__ 95
#define _IO_peekc_unlocked(_fp) ((_fp)->_IO_read_ptr >= (_fp)
->_IO_read_end && __underflow (_fp) == EOF ? EOF : *(unsigned char *) (_fp)->_IO_read_ptr)
#define _IO_stderr ((_IO_FILE*)(&_IO_2_1_stderr_))
#define _IO_USER_LOCK 0x8000
#define __long_double_t long double
#define _PARAMS(protos) __P(protos)
#define _IOLBF 1
#define __stub_sstk
#define _G_va_list __gnuc_va_list
#define _IOS_NOCREATE 32
#define _IO_FIXED 010000
#define __stub_stty
#define _IONBF 2
#define __STDC_IEC_559__ 1
#define L_ctermid 9
#define _IO_BAD_SEEN 0x4000
#define _WCHAR_T_DEFINED
#define _IO_DEC 020
#define _IO_RIGHT 04
#define _IO_ftrylockfile(_fp)
#define __stub_fattach
#define __P(args) args __THROW
#define _IO_putc_unlocked(_ch, _fp) (((_fp)->_IO_write_ptr
>= (_fp)->_IO_write_end) ? __overflow (_fp, (unsigned char) (_ch)) :
(unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch)))
#define _IO_ssize_t _G_ssize_t
#define ___int_wchar_t_h
#define __stub_setlogin
#define _G_off_t __off_t
#define __GNUC_PREREQ(maj, min) ((__GNUC__ << 16) + __GNUC_MINOR__ >=
((maj) << 16) + (min))
#define _G_LSEEK64 __lseek64
#define _SIZET_
#define __stub_fexecve
#define __USE_POSIX 1
#define _IO_off_t _G_off_t
#define _IO_HEX 0100
#define _IO_putwc_unlocked(_wch, _fp) ((_fp)->_wide_data->
_IO_write_ptr >= (_fp)->_wide_data->_IO_write_end ? __woverflow
(_fp, _wch) : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++
= (_wch)))
#define __restrict_arr
#define _SIZE_T
#define _IO_stdout ((_IO_FILE*)(&_IO_2_1_stdout_))
#define __attribute_format_strfmon__(a, b)
#define _IOS_APPEND 8
#define _IO_BOOLALPHA 0200000
#define __USE_POSIX199309 1
#define TMP_MAX 238328
#define __STRING(x) #x
#define __WINT_TYPE__ unsigned int
#define _G_IO_IO_FILE_VERSION 0x20001
#define __wchar_t__
#define _SYS_CDEFS_H 1
#define __USE_POSIX199506 1
#define _G_HAVE_BOOL 1
#define __THROW
#define __stub___kernel_tanl
#define _IOS_INPUT 1
#define _IO_OCT 040
#define __USE_SVID 1
#define _G_OPEN64 __open64
#define _STDIO_USES_IOSTREAM
#define __pentium__ 1
#define _BSD_SOURCE 1
#define _BSD_SIZE_T_
#define _IO_IS_FILEBUF 0x2000
#define __i586__ 1
#define _G_HAVE_ATEXIT 1
#define __stub___kernel_sinl
#define i386 1
#define _IO_LINKED 0x80
#define _G_FSTAT64(fd, buf) __fxstat64 (_STAT_VER, fd, buf)
#define i586 1
#define __GLIBC_PREREQ(maj, min) ((__GLIBC__ << 16) + __GLIBC_MINOR__ >
= ((maj) << 16) + (min))
#define __GNUC_VA_LIST
#define _IO_peekc(_fp) _IO_peekc_unlocked (_fp)
#define _IO_HAVE_SYS_WAIT _G_HAVE_SYS_WAIT
#define _G_HAVE_SYS_WAIT 1
#define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0)
#define _IO_fpos64_t _G_fpos64_t
#define __stub_posix_fadvise64
#define __CONCAT(x, y) x ## y
#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
#define __attribute_malloc__
#define _IO_LINE_BUF 0x200
#define _WCHAR_T_DEFINED_
#define __REDIRECT(name, proto, alias) name proto __asm__
(__ASMNAME (#alias))
#define __pentium 1
#define _G_uid_t __uid_t
#define __unix 1
#define __BEGIN_DECLS
#define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
#define __USE_ANSI 1
#define _WCHAR_T
#define _IO_uid_t _G_uid_t
#define _G_ARGS(ARGLIST) ARGLIST
#define __USE_BSD 1
#define _SVID_SOURCE 1
#define pentium 1
#define _IOS_BIN 128
#define _SIZE_T_DEFINED
#define _IO_va_list __gnuc_va_list
#define _IO_SHOWPOINT 0400
#define _WCHAR_T_
#define __unix__ 1
#define _IO_DONT_CLOSE 0100000
#define _G_HAVE_LONG_DOUBLE_IO 1
#define __stub_fchflags
#define _IO_USER_BUF 1
#define _T_SIZE_
#define _G_pid_t __pid_t
#define _G_off64_t __off64_t
#define _IOS_TRUNC 16
#define _IO_fpos_t _G_fpos_t
#define _IO_pid_t _G_pid_t
#define _IO_EOF_SEEN 0x10
#define P_tmpdir "/tmp"
#define _G_wint_t wint_t
#define __ASMNAME2(prefix, cname) __STRING (prefix) cname
#define _BITS_TYPES_H 1
#define __GNUC__ 2
#define _IO_NO_WRITES 8
#define _IO_IN_BACKUP 0x100
#define _SIZE_T_DEFINED_
#define _GCC_SIZE_T
#define stdin stdin
#define NULL ((void *)0)
#define _IO_UNITBUF 020000
#define __defined_schedparam 1
#define __KERNEL_STRICT_NAMES
#define _BITS_WCHAR_H 1
#define FILENAME_MAX 4095
#define _WCHAR_T_H
#define _IO_stdin ((_IO_FILE*)(&_IO_2_1_stdin_))
#define _IO_PENDING_OUTPUT_COUNT(_fp)
((_fp)->_IO_write_ptr - (_fp)->_IO_write_base)
#define _BITS_PTHREADTYPES_H 1
#define _IO_wint_t _G_wint_t
#define __stub_gtty
#define putc(_ch, _fp) _IO_putc (_ch, _fp)
#define __size_t__
#define __USE_POSIX2 1
#define _GCONV_H 1
#define _PTHREAD_DESCR_DEFINED
#define __linux 1
#define __stub_chflags
#define __PMT(args) args
#define __stub_sigreturn
#define __stub_fdetach
#define __SIZE_T
#define _G_NEED_STDARG_H 1
#define __ELF__ 1
#define __GNU_LIBRARY__ 6
#define _IO_CURRENTLY_PUTTING 0x800
#define __WCHAR_MAX (2147483647l)
#define _POSIX_SOURCE 1
#define __size_t
#define _G_HAVE_SYS_CDEFS 1
#define __WCHAR_MIN (-2147483647l - 1l)
#define _G_HAVE_PRINTF_FP 1
#define _T_WCHAR_
#define _T_SIZE
#define __stub___kernel_cosl
#define _G_HAVE_IO_GETLINE_INFO 1
#define _IO_UNIFIED_JUMPTABLES 1
#define _GCC_WCHAR_T
#define _G_wchar_t wchar_t
#define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
#define __END_DECLS
#define _IO_cleanup_region_start(_fct, _fp)
#define _IO_SKIPWS 01
#define _SIZE_T_
#define FOPEN_MAX 16
#define _IOS_OUTPUT 2
#define __GLIBC_MINOR__ 2
#define __bounded
#define _G_HAVE_MMAP 1
#define _T_WCHAR
#define _IO_SHOWPOS 02000
#define __STDC_IEC_559_COMPLEX__ 1
#define unix 1
#define _STDIO_H 1
#define _G_VTABLE_LABEL_HAS_LENGTH 1
#define __FD_SETSIZE 1024
#define __flexarr [0]
#define _IO_IS_APPENDING 0x1000
|
|
● -dD
プリプロセッサに対してすべてのマクロ定義を出力へ渡すよう指示します.
● -dN
-dDと似ていますが,#define hogeという形式の情報だけが出力に含まれます.
● -trigraphs
ANSI Cの3文字表記をサポートします.これは使用しないほうが良いでしょう.
● -Wp,option
optionをプリプロセッサへのオプションとして渡します.optionにカンマが含まれる場合は,カンマで分割されて複数のオプションとして渡されます.
なお,アセンブラにオプションを渡す場合には-Waとすると上のオプションと同様に使用できます.
|