2012-10-10 12 views
10

おそらく未経験の質問 - 私は20年前にプログラミングをしていたので、それ以来ずっとコード化していません。それ以来、大幅に萎縮したかC preprocessor作品の私の記憶は...#define(Cプリプロセッサ)の配列形式

私は非常に単純なCプログラムを書いていますし、私はいくつかの静的なグローバル配列を宣言しようとしていますが、arraysの大きさは、上の(依存だろう変数はMODEです)。以下のような単純な例のようなもの。

2つのクイックポイント:MODEで必要とされる最大サイズに応じてarraysのサイズを調整することができますが、これは嫌です(下の簡単な例とは異なります)。非常に大きくなる一方で他は小さい。

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

//** 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]; 
+0

'int SIZE_LIST_1 [5] = {2,7 ... 76}; ' –

+1

マクロは置換文字です。 – Jack

+0

あなたは[S1]の意味を理解できません。あなたは何をしようとしていますか? –

答えて

10

あなたは簡単な方法でこれを行うことができます前に、第1のヘルパーマクロの束を定義する必要があります。

#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]; 

の束があります。ボイラープレートコード(PP、P99を引き上げる)で得ることができるプリプロセッサ 'ライブラリ'、または自分でロールすることができます。主な問題は、あなたが扱いたい引数の最大数に基づいてARGマクロを定義する必要があるということです。

7

おそらくあなたができる最善のは、このようなものです:私はそのような可能性がない怖い

#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]; 
+0

ポールありがとうございました - これはちょっと面倒ですが、問題を解決することができます。私はあなたがそれを行うことができるとは知らなかった。 私はそれを行うのは、よりエレガントな方法はありません? – user1735592

+0

いいえ - プリプロセッサは実際には非常に制限されており、このような悪用のために設計されていません。私はなぜこの答えが匿名のダウン投票を得たのか分かりません - それは非常に優雅ではありませんが、問題を解決します。ああ... ... –

+1

私はそれが投票しなければならない理由も見ない。アイデアをもう一度ありがとう。 – user1735592

3

私が代わりに次のアプローチを提案する:

#define MODE 0 

#define DECLARE_ARRAYS_WITH_SIZES(S1, S2, S3) \ 
    int arr1[S1]; \ 
    int arr2[S2]; \ 
    int arr3[S3]; 

#if MODE == 0 
DECLARE_ARRAYS_WITH_SIZES(3, 6, 7) 
#elif MODE == 1 
DECLARE_ARRAYS_WITH_SIZES(8, 2, 1) 
#endif