HobNote
C言語関係[04]
since 2015.10.13
last update 2016.06.04



emacsでmake

emacs上でmakeを実行するには、
MakefileのあるDirectoryでemacsを起動している状態で、
デフォルトでは、
と聞いてくるのでオプションkのままでいいなら、そのままリターン
オプションkは、エラーがでてもできるかぎり実行しようとするオプションである。
オプションkが不要なら[BS]キーで-kを消してからリターン



emacsでgdbを使ってデバッグ

まずemacsの設定で.emacsに以下の行を追加することでgdb用の複数の分割windowが表示されるようになる。
で、gdbでデバッグするためのMakefileのCFLAGSは、
のように-g3-O0をしてしておく。
-gと同様に-g3は、デバッグ情報の付加を指示するもので-glevelのlevel 3を意味する。
-O0は最適化を無効にすることを意味する。
最適化を無効にしておかないとlocal変数の情報が消えてしまいトレースすることができない



例として以下のようなファイルで実行してみる。

そのディレクトリでemacsを起動しこれらをmakeした後 M-x gdbと入力すると
と表示されるのでリターン。em_gdbtstは、makeで生成された実行プログラム。
M-x gdbをするとそのディレクトリ内で最初に見つけた実行権限のあるファイルを選択するようだ。
なのでデバッグ対象を変えたければem_gdbtstを書き換えればいい。
で、こうなる。

代表的な使い方は以下の通りである。

参考URL:
     http://d.hatena.ne.jp/higepon/20090505/p1
     https://www.cs.umd.edu/class/fall2012/cmsc216/resources/gdb-emacs.htm
     http://rat.cis.k.hosei.ac.jp/article/devel/debugongccgdb3.html



gccで定義されているマクロを表示する

gccで定義されているマクロの一覧を表示するには、コマンドラインより
  gcc -dM -E - < /dev/null
で出力される。



#if, #ifdef プリプロセッサ指示の違い

プリプロセッサ指示#defineで設定したマクロを条件により変えたい場合
#if〜#elif〜#else〜#endifや#ifdef〜#else〜#endifを使うことになる。

で、#ifと#ifdefでなにが違うかというと
#ifは、#ifの後の式やマクロが0以外であれば真、0であれば偽として条件コンパイルをする。
#ifdefは、#ifdefの後のマクロが存在すれば真、存在しなければ偽として条件コンパイルをするというものである。

以下、例。まぁこれだとあまり違いはわからないんだけど。。。