VCのコンパイル設定など(C学習中)

Code Reading』第2章を読んだり写して動かしたりしつつ、覚えたこととかワカランこととかメモ。環境:Visual C++ 2010 Express

__Pマクロの意味

Pマクロは、ANSI以前のコンパイラ向けの関数宣言。

読んでるのがNetBSDのコードだから出てくるけど、基本的には排斥されつつある記述だと認識していればいいのかな・・・。

VCのコンパイル設定

コンパイルの警告レベルは、プロジェクト選択→[プロパティ]→[構成プロパティ]→[C/C++]→[全般]で変更できる(デフォルトはLevel3)。Level4以上にしておけば、一度も参照していない変数を警告してくれる。ただ、初期化していない変数を警告してくれる方法が分からない(あるのかな?)。

任意のコンパイルオプションを追加したければ、[C/C++]→[コマンドライン]に次のオプションを書ける。

下記は、GCCとVCのコンパイラの比較がまとめられている素晴らしいページ。

unistd.hのgetoptをVCで使いたいとき

getopt関数は、unistd.hで定義されている。unistd.hはWindows環境のVCに存在しないため、includeしようとするとエラーになる。unistd.hの一部の関数はVCにもある他のヘッダファイル(io.hなど)で定義されているので、代わりにそれらを使って済めばよい。しかしgetoptはない。

というわけで、次の方法でビルドして使用する。

  1. 任意のフォルダにgetopt.cとgetopt.hを入れる。
  2. プロジェクト選択→[プロパティ]→[構成プロパティ]→[C/C++]→[全般]で、[追加のインクルード ディレクトリ]にフォルダを指定する。
  3. プロジェクト選択→[既存項目の追加]から、getopt.cを追加する。

既存項目の追加で、プロジェクトにヘッダファイルを追加することもできるが、コンパイルエラー「fatal error C1083: include ファイルを開けません」が出る。なので、コンパイルオプション(/I)でインクルードディレクトリを指定する。(上記2)

また、インクルードディレクトリを指定しただけの状態だと、コード単体でのコンパイルはできるが、プロジェクトのビルドでエラーになる。「error LNK2001: 外部シンボル "_optind" は未解決です」「error LNK2019: 未解決の外部シンボル _getopt が関数 _main で参照されました」など。これは、コードの実体がなくても外部参照情報がVCのobjファイルに書き込まれてコンパイルまではできたものの、ビルドする時にリンクに失敗している、という状態らしい。なので、ソースファイルをプロジェクトに追加する。(上記3)

# 初心者が困るポイントらしく、検索すると色々でてきたけれど、結局どうするのが正しいのか分からない。。。