1

マクロで文字列の配列を取得したいと思います。最初に:それは可能ですか?

はいの場合、それらを使用しているときに、インデックスに基づいて 1 つずつ呼び出すことができますか?

このようなもの:

#define VAR    "abc", "def", "xyz"

それからどこかで「def」を使いたいとき、

FUNC(VAR[1]);
4

4 に答える 4

2

あなたに役立つ私のコードかもしれません:

#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 を変更する必要があります。

于 2012-12-21T13:05:13.010 に答える
1

C99以降、複合リテラルを使用できます

#define VAR ((char const*[]){ "abc", "def", "xyz" })

そして、これをそのまま使用しますVAR[2]

複合リテラルは、初期化子のキャストに似ています。ここでは、これは基本型の配列ですchar const*。これconstは、文字列リテラルを誤って変更しようとしないために重要です。

最新のコンパイラは、その配列と文字列リテラルのすべての異なる出現を 1 つのインスタンスに折りたたむことができるはずです。

于 2012-12-21T13:07:08.857 に答える
1
#define VAR(...) const char *FOO[] = { __VA_ARGS__ }
...
VAR("abc", "xyz");
printf("%s\n", FOO[0]);

ただし、次の点に注意してください。

  1. マクロは悪です。
  2. マクロで変数を宣言することは、これまでで最悪のアイデアです。
于 2012-12-21T12:45:04.353 に答える
0

マクロは右側のテキストに展開されるので、自分で質問に答えてみてください。

マクロを理解しようとする方法は次のとおりです。

FUNC(VAR[1]); <=> FUNC("abc", "def", "xyz"[1]);

右の人はあなたが期待することをしますか?いいえ?それでは、このままでは使えません。ただし、これを静的配列の初期化に使用してから、たとえばインデックスで配列にアクセスできます。

編集:マクロの使用を提案する方法は次のとおりです。

char* a[] = {VAR};
FUNC(a[0]);
于 2012-12-21T12:40:21.090 に答える