Cプリプロセッサーでファイルが存在するかどうかを知ることはできますか?
質問
私は非常に大きなコードベース (数千のモジュール) を持っています。そのコードは、すべて異なるオペレーティング システムと異なる C++ コンパイラで実行される多数のプロジェクトで共有されています。言うまでもなく、ビルド プロセスを維持することは非常に面倒です。
コードベースには、プリプロセッサが特定の
#includes
を無視させる方法があれば、コードを大幅にきれいにすることができます。誰かそれを達成する方法を知っていますか?
現在、私たちは
#ifdef
の周りに
#include
を定義したプロジェクト固有のファイルがあります。
#include
がプロジェクトに存在するかどうかを定義する2番目のプロジェクト固有のファイルがあります。これは機能しますが、醜いものです。プロジェクトにファイルを追加または削除したときに、定義が適切に更新されることを忘れてしまうことがよくあります。このファイルを最新の状態に保つためのプリビルド ツールを書くことも考えましたが、プリプロセッサでこれを行うプラットフォームに依存しない方法があるのなら、その方法で行いたいと考えています。何かアイデアはありますか?
どのように解決するのですか?
一般的にこれは、ファイルをインクルードしようとする際にプリプロセッサを実行しようとするスクリプトを使用することによって行われます。プリプロセッサがエラーを返したかどうかに応じて、スクリプトは生成された .h ファイルを適切な #define (または #undef) で更新します。bash では、このスクリプトは何となく次のような感じになります。
cat > .test.h <<'EOM'
#include <asdf.h>
EOM
if gcc -E .test.h
then
echo '#define HAVE_ASDF_H 1' >> config.h
else
echo '#ifdef HAVE_ASDF_H' >> config.h
echo '# undef HAVE_ASDF_H' >> config.h
echo '#endif' >> config.h
fi
このような移植性チェック(および何千もの他のものと同様に)を移植可能に扱うためのかなり徹底したフレームワークは autoconf .
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】'std::cout'への未定義の参照