2012-06-04 63 views
2

extern "C" { 
    typedef struct Pair_s { 
     char *first; 
     char *second; 
    } Pair; 

    typedef struct PairOfPairs_s { 
     Pair *first; 
     Pair *second; 
    } PairOfPairs; 
} 

Pair pairs[] = { 
    {"foo", "bar"}, //this is fine 
    {"bar", "baz"} 
}; 

PairOfPairs pops[] = { 
    {{"foo", "bar"}, {"bar", "baz"}}, //How can i create an equivalent of this NEATLY 
    {&pairs[0], &pairs[1]} //this is not considered neat (imagine trying to read a list of 30 of these) 
}; 

我該如何實現上述樣式聲明的語義?我如何在C++中聲明一個帶有填充信息的指針?

+2

在C++中,你可以使用'std :: string'而不是'char *'。然而,這些「雙」之間的關係是什麼? –

+0

@JesseGood它的C++代碼與c代碼接口,所以它使用'char *'s。這一對是一個關鍵/值,一對對是一個小集。因此,除了所聲明的內容之外,它們之間不存在任何關係,這就是爲什麼'&pairs [0],&pairs [1]'符號不可能被讀取的原因。 – chacham15

+2

您可以使用'std :: string'並仍然與C代碼交互。只需在字符串上調用'c_str()'來獲得一個可以傳遞給C代碼的字符指針。 – jalf

回答

5

在C++ 11你可以寫:

PairOfPairs pops[] = { 
    { new Pair{"a", "A"}, new Pair{"b", "B"} }, 
    { new Pair{"c", "C"}, new Pair{"d", "D"} }, 
    // the grouping braces are optional 
}; 

請注意使用自由存儲的含義:對象分配有在你的程序的執行結束時不破壞(如靜態對象)或其他時間(沒有相應的delete)。如果Pair是C結構並且不管理資源(並且您始終希望程序使用該內存直到它退出),那麼在託管實現中可能不會擔心。

編輯:如果你不能使用C++ 11功能,你可以隨時創建一個輔助函數。例如:

static Pair* new_pair(const char* first, const char* second) 
{ 
    Pair* pair = new Pair; 
    pair->first = first; 
    pair->second = second; 
    return pair; 
} 
+0

什麼是幾千字節的浪費內存(實際上,直到退出後纔會使用)?唯一值得關注的是C++ 11,g ++的早期版本有沒有辦法? – chacham15

+0

@ chacham15您可以隨時使用免費的幫助函數在pre-C++ 11中構建POD類型。請參閱編輯。 –

+0

+1,如果動態分配不是一個問題,這是要走的路。 – jxh

2

這是一種情況,我認爲宏會增加您的代碼的可讀性。你可以創建一個無人看守的包含文件:

/* file: pairs.def */ 
PAIR_DEF(foo, bar) 
PAIR_DEF(bar, baz) 
//... 

當你初始化pairs數組,你可以使用這個文件:

Pair pairs[] = { 
#define PAIR_DEF(x, y) { #x, #y }, 
#include "pairs.def" 
#undef PAIR_DEF 
}; 

並且可以創建對應的枚舉常量:

enum PairEnum { 
#define PAIR_DEF(x, y) PAIR_ ## x ## _ ## y, 
#include "pairs.def" 
#undef PAIR_DEF 
}; 

然後創建一個助手宏來幫助你初始化你的pops陣列。

#define PAIR(x, y) &pairs[PAIR_ ## x ## _ ## y] 
PairOfPairs pops[] = { 
    { PAIR(foo, bar), PAIR(bar, baz) }, 
    //... 
}; 

這類似於我使用enum值關聯到的字符串,在我的回答this question描述的技術。

+0

聰明,但有點複雜。 eq的解決方案似乎有點清潔 – chacham15

+0

@chacham15,唯一的好處是它不依賴於C++ 11,並且沒有動態內存分配。每當必須使用枚舉匹配字符串時,我都會使用這種技術。 – jxh

+0

是的,真的夠了。因此+ 1 :) – chacham15