デバッグなしで開始とデバッグ開始との違いの一つに,変数の初期化の有無がある.
デバッグなしで開始の場合には“たまたま正常に”動作しているが,デバッグ開始を行うことで
“ハンドルされていない例外が発生しました”
とエラーが出てくる場合がある.
この場合,変数の初期化を疑ってみるのがいい.結構これで解決したりするので.
ショートカットは『Ctrl+A+K+F』でそろう.
ちなみに,『Ctrl+A』は全範囲選択のショートカット.
void型関数にてエラー時の処理として,exit(1)がある.
exit(-1)とかでも構わないが,違いはない.
正常終了時にはexit(0)であり,異常終了時には0以外の数であればよい.
この引数は,要はエラーが生じた時に致命的なエラーかどうかを判断するので,呼び出し元というか,
呼び出されたときの挙動をどうするか・・・といったことに依存することになる.
void型としたのは,returnが呼び出し元に戻るのに対して,exitはシステムに戻るためである.main関数内で使えば,どちらも同じ動きをする.
違いとしては,returnは値を返すのに対し,exitはプログラムを終了させることである.
mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file ~~~
っていうエラー,ビルドするとたまーに出てくるようになった.
調べてみると,ウイルスソフトが原因だとか.
あと同じこと(ウイルスソフト)が原因と思われるエラーに,文字化け的なエラーがある.
再び出くわしたときに更新するけど,
1>mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file "..\hoge\hoge.exe". "/;9LR&U~W_
のような感じ.もう一度ビルドすれば治るのである.んー!?深く考えないことにしているが,何なんだろうこれは.
LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています. /NODEFAULTLIB:library を使用してください.
これはDebag構成でビルドした時に起こった.
原因はランタイムライブラリを『マルチスレッド(/MT)』で設定していたことによるもの.
プログラム側で使っているLibと,参照しているLibが違うために起こっていると思われる.
確認方法は以下の通り.
「プロジェクトのプロパティー>構成プロパティ>C/C++>コード生成>ランタイムライブラリ」で『マルチスレッドデバッグ(/MTd)』に変更する.
ちなみに今回の場合はRelease構成では『マルチスレッド(/MT)』で構わない.
また,他の人が作ったプログラムなどでは,「自分はRelease構成でビルドをしたいのに・・・・・・このエラーが出る!!」みたいな事が起こりうる.
この場合,つまりはリンクしてあるライブラリと参照しているライブラリが違うためにおこっているので,Release構成でのビルド時に,
「プロジェクトのプロパティー>構成プロパティ>リンカ>入力>特定のライブラリの無視」のところに『libcmtd.lib』を追加すればいい.
逆の場合も同様.
LINK : warning LNK4199: /DELAYLOAD:OleAcc.dll は無視されます。OleAcc.dll にインポートがありません。
これは,「プロジェクトのプロパティー>構成プロパティ>全般>MFCの使用」の部分が「スタティックライブラリでMFCを使用する」になっているときに,怒られる.
「標準Windowsライブラリを使用する」とかに変更すれば怒られない.