2017-06-01 12 views
2

私は、2D配列(レーン)を含むヘッダファイル内に定義された構造体を持っています。 コンパイル時に、環境変数を設定するなどして、配列のサイズを定義したいと思います。Cヘッダファイルの外部定義定数

#ifndef GAMEBOARD_H 
#define GAMEBOARD_H 

struct gameboard 
{ 
    int lanes[4][4]; 
    int isWonBy; 
    int isFinished; 
    int nextPlayer; 
}; 

struct gameboard *put(struct gameboard *board, int laneIndex); 

#endif 

私は、この構造体のすべてのインスタンス間で、実行時に一定の大きさで、配列を維持するが、その大きさは、ソースコードを毎回変更することなく、コンパイル時に何であるかを定義します。配列の高さと幅は別々にし、デフォルト値を持たなければなりません。

+0

ビルドシステムでは、環境からディメンションをフェッチしたり、ディメンションのマクロを定義するコンパイラプリプロセッサフ​​ラグをビルドシステムに設定させることができます。それらのマクロをソースで使用します。 –

答えて

4
#ifndef LANES_DIMENSION 
#error "You must define LANES_DIMENSION at compile time!" 
#endif 

struct gameboard 
{ 
    int lanes[LANES_DIMENSION][LANES_DIMENSION]; 
    int isWonBy; 
    int isFinished; 
    int nextPlayer; 
}; 

GCC

gcc -DLANES_DIMENSION=10 source.c 

MSVC

cl /DLANES_DIMENSION=10 source.c 
+0

また、その値を構造体に格納して、実行時に推測できるようにすることもできます。 –

+0

このヘッダを含む複数のソースファイルがあり、それらをコンパイルするためにメイクファイルを使用しています。このヘッダーを含むすべてのファイルのレシピに-D ...引数を追加する必要がありますか(CFLAGSに追加することもできます)か、またはこの引数でコンパイルする必要があるファイルを事前に知る信頼できる方法がありますか? –

+0

通常、このようなフラグを 'CFLAGS'に追加します。 – fukanchik

0

もう一つの方法は、この値のみのために小さなarray_size.hファイルを持つことです。 #includegameboard.hにあり、コンパイル時などに再生成します。

@echo #define ARRAY_SIZE %ENV_DEF% >array_size.h 
関連する問題