#include "stdafx.h"を書かずに済ませるには"必ずインクルード"を使う

fatal error C1020: 予期しない #endif です。 - モデラート - C#とゲーム開発と雑記で書いた以下のコードが必要なのは、
Windows上のVSと別の環境で同じコードを利用したい時などです。


#ifdef _WIN32
#include "stdafx.h"
#endif

fatal error C1020: 予期しない #endif です。

このコードではエラーになるので使えません。


プリコンパイル済みヘッダを使わないという方法で解決したのが前回の記事でした。


今回の方法はこれらの問題の解決に使えますが、プリコンパイル済みヘッダを使うけど、
ソースごとにわざわざ#include "stdafx.h"を書くのが面倒なので書かずに済ますためにも使えます。


プロジェクトのプロパティから[C/C++]->[詳細]を選択
必ずインクルードという項目があるので、ここにstdafx.hと記述します。
これで終わり。
VSでの設定に過ぎないので他の環境ではstdafx.hはないものとして扱えますね。


以下、考察というか蛇足


ここでプリコンパイル済みヘッダであるstdafx.hは必ずインクルードに指定せず、プリコンパイル済みヘッダを使用するcppにのみ#include "stdafx.h"と記述したとます。
ここでstdafx.hとは別のファイル(force.hとしましょう)を必ずインクルードに指定する場合は特に問題ありません。
(厳密にはstdafx.hそのものがプリコンパイル済みヘッダではないですが、便宜上そう記述します)


問題になるのは、force.hは必ずインクルードにしておきたいけど、stdafx.hを追加で各cppに記述するもの面倒なんでこれをforce.hの中に記述してしまうという、もうどうしたいのかよく分からないときです。
(stdafx.hを必ずインクルードにしてforce.hはstdafx.hの中でインクルードすりゃいい)


これはコンパイルで失敗します。
プリコンパイル済みヘッダを使用する場合設定では([C/C++]->[プリコンパイル済みヘッダー])
ファイルを使用してPCHを作成/使用にStdAfx.hとあると思いますが、#includeディレクティブでそれをインクルードする場合、cpp内で真っ先にインクルードされる必要があるということです。
この場合だとforce.hがインクルードされ、次にstdafx.hがインクルードされるのでだめですね。


#includeディレクティブでなく、force.h、stdafx.hがどちらも必ずインクルードで指定される場合も同様に
stdafx.hが最初にインクルードされなければなりません
stdafx.h;force.hというように。
つまり、stdafx.hはインクルードする方法の中で最も先にインクルードされていなければならないということです。


別の問題で正しくStdAfx.hがインクルードされるか、というよりStdAfx.hという文字列が#includeディレクティブで指定されているかが重要です。
なのでパスの関係で、#include "../StdAfx.h"とかするとうまくいかなかったりするみたいです。
大文字小文字は普通に関係ないみたいだけど。


プロジェクトのテンプレートの段階で必ずインクルードになっててもいいと思うんだけどなぁ・・・


参考
VC++ のプリコンパイル済みヘッダ | どうでもいいメモ(保守中)
http://dodeka.net/~j2/wp/?p=244