2012-08-22 72 views
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" 
} 

編輯: 我已經認識到,在一個頭文件中我可以公開的所有字符串不用包裹它們的結構或外擴它們,並實現了主力的意圖,每串一行:

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

你甚至嘗試這些數組的初始化?他們應該工作 - 儘管'struct language_string = {...}'是錯誤的。 – oldrinb

+1

正如你似乎計劃一個多語言的應用程序,你可能想看看這裏:http://www.gnu.org/software/gettext/ – alk

回答

6

你有什麼已經幾乎正確。儘管如此,你不能交錯聲明和初始化。這裏有一個修正的例子:

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

使用'.language_hello = {「你好」,「Hola」,「 Bonjour「},'也許是適當的。 – caf

+0

是的,交織聲明和初始化是主要意圖,謝謝你確認這是不可能的! –

+0

caf,是的,因爲列表變長了,指定的初始化方法降低了填充的風險。 –

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] } 
    }; 
} 
+1

以何種方式更易於維護?現在你必須保持兩個(好的,3個)列表同步! –