マクロで文字列の配列を取得したいと思います。最初に:それは可能ですか?
はいの場合、それらを使用しているときに、インデックスに基づいて 1 つずつ呼び出すことができますか?
このようなもの:
#define VAR "abc", "def", "xyz"
それからどこかで「def」を使いたいとき、
FUNC(VAR[1]);
あなたに役立つ私のコードかもしれません:
#include<stdio.h>
#include<stdlib.h>
#define STRING_ARRAY "ONE", "TWO", "THREE", "NULL"
int main(){
char* STRING[] = {STRING_ARRAY};
int i=0;
scanf("%d",&i);
printf("%s\n",STRING[i]);
return EXIT_SUCCESS;
}
これも機能します:
:~$ gcc x.c -o x
:~$ ./x
1
TWO
e:~$ ./x
2
THREE
再コンパイル時のみ MACRO を変更する必要があります。
C99以降、複合リテラルを使用できます
#define VAR ((char const*[]){ "abc", "def", "xyz" })
そして、これをそのまま使用しますVAR[2]
。
複合リテラルは、初期化子のキャストに似ています。ここでは、これは基本型の配列ですchar const*
。これconst
は、文字列リテラルを誤って変更しようとしないために重要です。
最新のコンパイラは、その配列と文字列リテラルのすべての異なる出現を 1 つのインスタンスに折りたたむことができるはずです。
#define VAR(...) const char *FOO[] = { __VA_ARGS__ }
...
VAR("abc", "xyz");
printf("%s\n", FOO[0]);
ただし、次の点に注意してください。
マクロは右側のテキストに展開されるので、自分で質問に答えてみてください。
マクロを理解しようとする方法は次のとおりです。
FUNC(VAR[1]); <=> FUNC("abc", "def", "xyz"[1]);
右の人はあなたが期待することをしますか?いいえ?それでは、このままでは使えません。ただし、これを静的配列の初期化に使用してから、たとえばインデックスで配列にアクセスできます。
編集:マクロの使用を提案する方法は次のとおりです。
char* a[] = {VAR};
FUNC(a[0]);