0

現在、2つのc ++プロジェクトがあり、同じソースファイルとヘッダーファイルの多くを共有しています。それらの1つはゲームサーバーであり、もう1つはクライアントです。私のクラスのいくつかは、クライアントまたはサーバーに固有の関数を持っているため、そのうちの1つに対してのみコンパイルする必要があります。しかし、私はこれについてどうやって行くのかわかりません。これまでの私の試みは次のとおりです。

  1. Client.h #define IS_CLIENT(main関数を含む)および#define IS_SERVERServer.hで使用します。他のヘッダーがそれらに必要だったため、これは失敗し#includeました(したがって、何かをコンパイルしたいときにすべてのヘッダーを変更する必要がありました)

  2. ここでCompileType.hを使用#include "CompileType.h"すると、IS_CLIENTまたはIS_SERVERのいずれかが定義されます。これは以前の方法以外の大きな改善ですが、コンパイルするたびにファイルを変更する必要があります。

#ifdef使用された試みとその周辺の両方の試み#endifは、.cppファイルの関数定義を選択します。

考えられる解決策は、可能であれば#define、グローバル規模で何かを行うことです(したがって、すべてのソースファイルとヘッダーファイルに影響します)。IDEの(Code :: Blocks)設定には、まだ見たことのないものがあるかもしれません。

この問題についての洞察をいただければ幸いです。

4

2 に答える 2

1

最善の方法は、すべての「サーバー」機能がサーバー専用の 1 つまたは複数のファイルにあり、すべての「クライアント」が独自のファイルにあるように、機能を完全に分離することです。したがって、基本的には、「サーバー」ファイルを含むディレクトリ、「クライアント」ファイルを含むディレクトリ、および「共通」ファイルを含むディレクトリの 3 つのディレクトリがあります。

#iforをソースファイルで使用#ifdefすることは、それを解決するための努力が本当に、本当に巨大でない限り、行うべきではありません。

于 2013-02-02T23:08:28.350 に答える
0

私が取り組んだあるプロジェクトでは、コア機能といくつかのオプション モジュールを備えたプログラムがありました。次に、モジュールに属するすべてのファイルがいくつかの#ifdef MODULENAME / #endifブロックに書き込まれ、プロジェクト スケールで定義することによって、どのモジュールをコンパイルするかを決定することができましたMODULENAME(Visual Studio ではプロパティ シートを使用しますが、コード ブロックに相当するものがあります)。また、ディスク上では、すべてのモジュール ファイルが別々のフォルダーにあるため、乱雑になりすぎません。このソリューションも機能します。

于 2013-02-03T00:08:02.427 に答える