オプション沼(10) gccの-Eオプションを活用する? -dM、-dN、-dDオプション

Joseph Halfmoon

前々回、-Eオプションに対して「積極的に使いたい感じはしない」などと不埒なことを書いてしまいました。しかし過ちは直ぐに訂正いたします。「結構お楽に使えるじゃん」と。-dM、-dN、-dDの3兄弟的オプションズと併用すれば、ということでありますが。知りたかったマクロの値が一目瞭然なのであります。お好みにより表現はチョイス

※『オプション沼』投稿順indexはこちら

前回、-Dオプションを使ってコマンドラインからマクロを与えて、プリプロセッサの動作を観察。その際、定義されているマクロの一覧が見れたら便利じゃね?と思いつきました。そんなことはお見通しってか?調べてみたらそういうオプションが存在してました。それも3つも。いずれも前々回登場の -E オプションと併用したときにのみ意味を持つオプションです。-Eを指定しないとさらっと通り過ぎてしまいます。

    • -dM
    • -dN
    • -dD

-Eと併用すると、標準出力にプリプロセスの結果が「どどっと」出力されてくるので、これを grep に通すなり、lessで見るなり、ファイルに落としてじっくり吟味するなりせよ、ということであります。

-dM オプション、有効なマクロ定義のみ出力

マクロのお名前が分かっていて、その値が知りてーといった場合には、一番適切なオプションでないかと思います。前回のソースコードを流用して-dMオプションの結果をテキストファイルに落としているところが以下に。

$ gcc -E -D OPD="1+3" -dM optD.c >dM.txt

出力ファイルの中身は#define文が並んでます。プリプロセッサがアクティブと認識した定義がずらずらと。その中にコマンドラインから指定したマクロ定義も見つかりました。こんな感じ。dM

コマンドライン上のダブルクォートはシェルから渡される際に毟られてしまい、マクロ定義としては1+3になっておることが確認できます。

-dNオプション、出現場所と順番

上記の-dMオプションでは、マクロ名と定義は分かりましたが、どこのヘッダファイルで定義されていたのか、定義の順番はどうであったのかは不明です。そこを解決してくれるのが -dNオプションみたいです。

$ gcc -E -D OPD="1+3" -dN optD.c >dN.txt

この出力を吟味してみると、以下のようです。OPDというマクロは<command-line>からやってきていることがわかります。dN

-dDオプション、出現場所、順番に加えて値も

上記-dNオプションにより出現場所は明らかになるのですが、マクロの値自体は省略されてしまいます。残念。値も欲しい場合は、-dDオプションを使わないとなりませぬ。こんな感じ。

$ gcc -E -D OPD="1+3" -dD optD.c >dD.txt

出力は以下に。dD

ーEオプション、いろいろ出し入れができるのね。

オプション沼(9) gccの-Dオプション、意外な使い方もあり?私は人生複雑にしたくないケド へ戻る

オプション沼(11) Makefileの友? それほどでもない? gccの-Mオプション へ進む