3

以下のような圧縮された構文で何百もの文字列を宣言して初期化できるCのデータ構造を探していますが、これはC11で可能ですか?

#include <stdio.h>

enum {ENGLISH, SPANISH, FRENCH, NUM_LANGUAGES};

struct language_string =
{
    const char* language_hello[NUM_LANGUAGES]   = {"Hello",     "Hola",     "Bonjour"};
    const char* language_goodbye[NUM_LANGUAGES] = {"Goodbye",   "Adiós",    "Au revoir"};
};

void foo(void)
{
    printf(language_string.language_hello[ENGLISH]);        // print "Hello"
}

編集:ヘッダーファイルでは、すべての文字列を構造体でラップしたり、外部に移動したりせずに公開でき、文字列ごとに1行という主な目的を達成できることに気付きました。

const char*  language_hello[NUM_LANGUAGES]   = {"Hello",   "Hola",  "Bonjour"};
const char*  language_goodbye[NUM_LANGUAGES] = {"Goodbye", "Adiós", "Au revoir"};
4

2 に答える 2

6

あなたが持っているものはすでにほとんど正しいです。ただし、宣言と初期化をそのようにインターリーブすることはできません。修正された例を次に示します。

struct
{
    const char* language_hello[NUM_LANGUAGES];
    const char* language_goodbye[NUM_LANGUAGES]; 
} language_string = {
    {"Hello",     "Hola",     "Bonjour"},
    {"Goodbye",   "Adiós",    "Au revoir"}
};
于 2012-08-22T05:52:05.470 に答える
0

コードのメンテナンスを容易にするために、次のような構文を使用することをお勧めします。

#define NUM_LANGUAGES 3

typedef struct
{
    const char* hello[NUM_LANGUAGES];
    const char* goodbye[NUM_LANGUAGES];
} language_t;


const char* STR_HELLO [NUM_LANGUAGES] =
{
  "Hello",
  "Hola",
  "Bonjour"
};

const char* STR_GOODBYE [NUM_LANGUAGES] =
{
  "Goodbye",
  "Adiós",
  "Au revoir"
};


int main()
{
  language_t lang =
  {
    { STR_HELLO[0],   STR_HELLO[1],   STR_HELLO[2]   },
    { STR_GOODBYE[0], STR_GOODBYE[1], STR_GOODBYE[2] }
  };
}
于 2012-08-22T06:47:41.683 に答える