1

Is it possible to add a #define _MYDEFINE_ in my header file based on some options in the project settings. For Ex: Suppose in my exposed header file (which is delivered along with the library) I have some macros like shown below:

#ifdef _MYDEFINE_
#define ABC 2
#else
#define ABC 4
#endif

Now, while building my library, I can add _MYDEFINE_ in my settings, but I don't want the user of the library to add _MYDEFINE_ in his project settings or code. Instead I want "#define _MYDEFINE_" to automatically get added in the beginning of the header.

Note: #define _MYDEFINE_ should get added only when it is defined in my preprocessor settings. For other settings it should not get added.

If not possible through project settings, are there any innovative ways of getting it done? Any ideas are welcome.

4

4 に答える 4

4

Most C compilers accept the option -D to define a symbol:

gcc -D_MYDEFINE_ file.c

In that form, it is implicitly set to one. Otherwise one can explicitly set a value:

gcc -D_MYDEFINE_=4 file.c

Multiple -D are allowed, even on operating systems which make that difficult (such as VMS).

gcc -DSYMBOL1 -DSYMBOL2 -DSYMBOL3 file.c

These behave as though corresponding #define statements appeared before the first line of each command line file.

#define SYMBOL1 1  (these are virtually present due to command line -D options)
#define SYMBOL2 1
#define SYMBOL3 1

(actual source code begins)
/*
 * file.c:  
 */
#include <ctype.h>
#include <stdlib.h>
 ...
于 2010-02-12T18:16:07.083 に答える
2

ライブラリにどのような影響があるかを検討する必要がある場合があり_MYDEFINE_ます。

開発用 (NDEBUG など) にのみその効果が必要な場合は、-Dor/Dコンパイラ オプションを使用しても問題ありません。

ユーザーがライブラリを使用するときに何が起こるかに影響を与える効果がある場合は、もっと複雑なことをする必要があるかもしれません。後者の場合、ライブラリの 2 つのバージョンを作成することになり、libX-ABC2.a と libX-ABC4.a のように名前を付けることができます。また、インクルード ファイルの 2 つのバージョンも必要になり_MYDEFINE_、それぞれに適切に定義された構成ヘッダーを生成する必要がある場合があります。ライブラリがインストールされている場合、ヘッダー ファイル用にバージョン管理されたインクルード ディレクトリが必要になる場合があります。

たとえば、_MY_DEFINE_ が宣言された構造体のレイアウトや他のヘッダーの宣言された配列のサイズに影響を与える場合、ユーザーが#define ABC 4を想定するライブラリにヘッダーをインクルード#define ABC 2すると、ユーザーが追跡する厄介なバグが発生します。

これは前に見たことがあります。これを処理するのは難しく退屈ですが、これを行わないと、ライブラリのさまざまなバージョンで深刻な問題が発生する可能性があります。

于 2010-02-12T21:40:38.807 に答える
1

ビルド構成ヘッダー ファイルを用意し、他のヘッダー ファイルをインクルードする前にこのヘッダー ファイルをインクルードします。このビルド構成ヘッダー ファイルは、ビルド時に何らかのスクリプト メカニズムを使用して作成できます。

于 2010-02-25T08:48:49.697 に答える
0

「/D」コンパイラ フラグを探しているようです (地球上のほぼすべての C コンパイラで同一の数少ないフラグの 1 つです)。使用法は次のようになります。cc /D_MYDEFINE_ myfile.c

_MYDEFINE_関係のないことですが、アンダースコアで始まり、別のアンダースコアまたは大文字が続くような名前は、実装用に予約されていることに注意してください。つまり、そのようなものを使用することは想定されていません。

于 2010-02-12T18:17:50.353 に答える