1. ホーム
  2. c++

Cプリプロセッサーでファイルが存在するかどうかを知ることはできますか?

2023-08-24 23:06:08

質問

私は非常に大きなコードベース (数千のモジュール) を持っています。そのコードは、すべて異なるオペレーティング システムと異なる 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 .