5

cプリプロセッサで条件付きインクルードを作成する方法はありますか?

さまざまなチームで共有されているツールの「ライブラリ」(Tools.c、Tools.h)があります。このライブラリは2番目のライブラリに依存しており、XML機能を提供します。これを1つのXML.hと呼びましょう。1つのチームが2番目のライブラリのプレーンバージョン(XML.h)を使用し、別のチームがプロジェクトで拡張バージョン(XMLEx.h)を使用します。2番目のチームはXMLEx.hがすでに含まれており、XML.hのすべての機能を提供しているため、XML.hを含めたくありません。

次のようなものを実装するメカニズムはありますか?

#ifdef XML_EX
#include "XMLEx.h"
#else
#include "XML.h"
#endif

#define XML_EXより高い(プロジェクト)レベルでのみ?好き

#include "Tools.h"

チーム1と

#define XML_EX
#include "Tools.h"

チーム2の場合?(単純なソリューションでは機能しないことはわかっています。目的の「ワークフロー」を説明することをお勧めします。)

境界条件は次のとおりです。

  • Windowsシステム
  • CVI / LawWindows IDE
  • メイクファイルなし
  • Tools.hは、外部プロジェクトなしでコンパイルする必要があります。

編集:提案された解決策とヒントについては、それが一般的な方法であるということです。おそらくそれは私のビルドプロセスと関係がありますが、機能しません。IDEは、チーム2のXML.hが欠落していることについて不平を言っています。これは、IDEが「外部」の#defineについて知らずに、最初に各ソースをスタンドアロンでコンパイルしようとするためだと思います。

編集:ふりをしてみましょう。チームAは、IDEの[実行]ボタンしか押すことができなかった多くのモロンです。したがって、箱から出して作業するのが最善です。

編集:さて、それは私を困惑させました。私が学んだことはすべて私に教えてくれます、それはうまくいくはずです。これが最小限のセットです、私はテストしました:

main.c

#define XML_EX
#include "Tools.h"

void main(void)
{
  test();
}

次にTools.h

#ifdef XML_EX
  #include "XMLEx.h"
#else
  #include "XML.h"
#endif

XMLEx.hにはテスト機能があり、XMLEx.cはそれを実装しています。ビルドしようとすると、「XML.hが見つかりません」というメッセージが表示されます。#define XML_EXTools.hのaを使用すると、すべてが正常に構築されます。

4

3 に答える 3

3

あなたが提案した解決策は通常使用されているものであり、それはかなり頻繁に行われます。makefile/projectファイルでマクロを渡すこともできます。

また、これTools.hはヘッダーファイルであり、常に別のファイルの一部としてコンパイルされることに注意してください。

于 2012-09-07T08:35:20.523 に答える
0

チームAのマクロを定義し、チームBのマクロを定義しない、または異なる値を定義するteam.hファイルを作成すると、各チームに独自のteam.hのコピーが作成されます。

各チームメンバーは、-Dオプションマクロを介してその値をコンパイラに渡すこともできます(少なくともLinuxコンパイラはそれをサポートしています)。その場合は、将来の柔軟性を高め、より多くのマクロを渡す必要がないように、TEAM_AまたはTEAM_Bを渡すことをお勧めします。

于 2012-09-07T08:42:02.117 に答える
0

私は自分をだましました。上で述べたように、コードには何の問題もありません。IDEのエラーメッセージを誤って解釈しました。

例にとどまるために、私はTools.cも持っていて、プロジェクトにXML.hがなかったため、そのソースのコンパイルは(当然のことながら)失敗しました。プロジェクトからソースを削除し、プリコンパイルされたツールに対してリンクするだけで問題なく動作します。

于 2012-09-10T07:24:50.810 に答える