15

おそらく素朴な質問です。私は 20 年前にプログラミングをしていて、それ以来ほとんどコーディングしていません。それ以来、作品の記憶がC preprocessor著しく萎縮してしまった…。

私は非常に単純なCプログラムを書いており、いくつかの静的グローバル配列を宣言しようとしていますが、そのサイズはarrays(重要な方法で) 変数に依存しMODEます。以下の単純化された例のようなもの。

2 つの簡単なポイント: でarrays必要とされる最大サイズに応じて のサイズを変更できることはわかっMODEていますが、(以下の単純化された例とは異なり) これらのサイズの一部が非常に大きくなることがあるため、そうしたくありません。他は小さいです。

また、実行時に動的に割り当てるのではなく、静的に定義されたグローバル配列を使用したいと考えています。コンパイル時にコンパイラにサイズを持たせたい。

//** Simplified example of what I'd like to do **//    
#define SIZE_LIST_1[5] = {2, 7, 23, 33, 12, 76}  // I don't think this is valid syntax 
#define SIZE_LIST_2[5] = {11, 65, 222, 112, 444}

#define MODE 4
#define S1 SIZE_LIST_1[MODE]
#define S2 SIZE_LIST_2[MODE] 

int a[S1], b[S2];
4

4 に答える 4

15

簡単な方法でこれを行う前に、最初に一連のヘルパー マクロを定義する必要があります。

#define CONCAT(A,B)         A ## B
#define EXPAND_CONCAT(A,B)  CONCAT(A, B)

#define ARGN(N, LIST)       EXPAND_CONCAT(ARG_, N) LIST
#define ARG_0(A0, ...)      A0
#define ARG_1(A0, A1, ...)  A1
#define ARG_2(A0, A1, A2, ...)      A2
#define ARG_3(A0, A1, A2, A3, ...)  A3
#define ARG_4(A0, A1, A2, A3, A4, ...)      A4
#define ARG_5(A0, A1, A2, A3, A4, A5, ...)  A5
#define ARG_6(A0, A1, A2, A3, A4, A5, A6, ...)      A6
#define ARG_7(A0, A1, A2, A3, A4, A5, A6, A7, ...)  A7
#define ARG_8(A0, A1, A2, A3, A4, A5, A6, A7, A8, ...)      A8
#define ARG_9(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, ...)  A9
#define ARG_10(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, ...)    A10

/* above should be in a pp_helper.h header file or some such */

#define SIZE_LIST_1 ( 2,  7,  23,  33,  12,   76)
#define SIZE_LIST_2 (11, 65, 222, 112, 444, 1000)

#define S1 ARGN(MODE, SIZE_LIST_1)
#define S2 ARGN(MODE, SIZE_LIST_2)

#define MODE 4

int a[S1], b[S2];

ボイラープレート コード (boost PP、P99) で取得できるプリプロセッサの「ライブラリ」がたくさんあります。または、自分で作成することもできます。主な問題は、処理したい最大数の引数に基づいて ARG マクロを定義する必要があることです。

于 2012-10-10T17:56:13.587 に答える
11

おそらくあなたができる最善のことは、次のようなものです:

#define SIZE_LIST_1_0 2
#define SIZE_LIST_1_1 7
#define SIZE_LIST_1_2 23
#define SIZE_LIST_1_3 33
#define SIZE_LIST_1_4 12

#define SIZE_LIST_2_0 11
#define SIZE_LIST_2_1 65
#define SIZE_LIST_2_2 222
#define SIZE_LIST_2_3 112
#define SIZE_LIST_2_4 444

#define MODE 4

#define S1 SIZE_LIST_1_##MODE
#define S2 SIZE_LIST_2_##MODE

int a[S1], b[S2];
于 2012-10-10T17:16:15.490 に答える