我想用一個字符串值的結構內訪問的成員:如何根據字符串的值訪問`struct'的成員?
struct hello_world
{
char rate;
char ssid;
};
有一種varibale假設
char *string="ssid";
我想用這個字符串的值參考hello_world
結構中的ssid
成員。這可能嗎?
我想用一個字符串值的結構內訪問的成員:如何根據字符串的值訪問`struct'的成員?
struct hello_world
{
char rate;
char ssid;
};
有一種varibale假設
char *string="ssid";
我想用這個字符串的值參考hello_world
結構中的ssid
成員。這可能嗎?
不,不是。
您需要一個(長)if-else
聲明,這將做到這一點。像:
struct hello_world hw;
char *string="ssid";
if(0 == strcmp("ssid", string))
{
// use hw.ssid
}
else if ...
定義一個函數,就像一個包裝器來傳遞成員想要的。
char GiveMember(struct hello_world, char* member){ }
但語言本身並沒有爲您提供任何類似的東西。
如果成員是不同類型的呢? – 2013-03-22 10:02:45
傳遞'void *',除此之外,這不是問題的一部分......返回void *後 – 2013-03-22 10:04:13
,調用者需要再次知道該類型(將其重新轉換爲正確的類型)。聽起來像一份工作,做了兩次。不要誤解我的意思 - 我喜歡這個主意,但它不會總是有效的:) – 2013-03-22 10:05:54
而不是使用字符串,你最好使用一個枚舉與所有可能的情況。
typedef enum {
FIELD_SSID,
FIELD_RATE,
} field_t
field_t string;
,然後使用一個開關
switch (string) {
case FIELD_SSID:
//use ssid
break;
case FIELD_RATE:
//use rate
break;
}
這種方法比比較字符串方式更快。
如果您只使用一個字段或另一個,您可以使用聯合而不是結構。
是的,我想過這一個,但放棄建議,因爲標題問是否可能,使用字符串。 +1無論如何:) – 2013-03-22 10:08:44
以及你需要一個散列函數的字符串,然後做散列結果的開關,但你需要硬編碼這些結果或使用我想的宏。 – LtWorf 2013-03-22 10:11:50
此功能稱爲反射,C沒有。 – tjameson 2013-03-22 10:03:33
@tjameson - 是。好的音符。 – 2013-03-22 10:06:19
順便說一下,在這種特殊情況下,您不需要進行常量優先比較安全檢查,因爲strcmp(「ssid」,string)= 0(意外使用賦值而不是比較)將無法編譯。 – paxdiablo 2013-04-11 06:22:07