【问题标题】:How to access members of a `struct' according to a value of a string?如何根据字符串的值访问“结构”的成员?
【发布时间】:2013-03-12 03:18:46
【问题描述】:

我想通过使用字符串的值来访问结构中的成员:

struct hello_world
{
           char rate;
           char ssid;
};

假设有一个变量

char *string="ssid";

我想使用这个字符串的值来引用hello_world 结构中的ssid 成员。这可能吗?

【问题讨论】:

    标签: c string struct


    【解决方案1】:

    与其使用字符串,不如使用包含所有可能情况的枚举。

    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;
    }
    

    这种方法比比较字符串快得多。

    如果你只使用一个字段OR另一个,你可以使用联合而不是结构。

    【讨论】:

    • 是的,我想过这个,但放弃了建议,因为标题询问这是否可能,使用字符串。无论如何+1 :)
    • 对于字符串,您需要一个哈希函数,然后对哈希结果进行切换,但我想您需要对这些结果进行硬编码或使用宏。跨度>
    【解决方案2】:

    定义一个函数,比如一个包装器来传递你想要的成员。

    char GiveMember(struct hello_world, char* member){ }
    

    但是语言本身并没有为你提供这样的东西。

    【讨论】:

    • 成员不同类型怎么办?
    • void* 返回后,调用者需要再次知道类型(将其转换回正确的类型)。对我来说听起来像是一份工作,做了两次。不要误会我的意思——我喜欢这个主意,但它并不总是有效:)
    • @KirilKirov 我同意,但如果你想推动它并强制使用这样的机制...... ;)
    【解决方案3】:

    不,不是。

    您需要一个(长)if-else 语句,它可以做到这一点。喜欢:

    struct hello_world hw;
    char *string="ssid";
    
    if( 0 == strcmp( "ssid", string ) )
    {
         // use hw.ssid
    }
    else if ...
    

    【讨论】:

    • 这个特性叫做反射,C没有。
    • @tjameson - 是的。好记。
    • 顺便说一句,在这种特殊情况下,您不需要进行常量优先比较安全检查,因为 strcmp ("ssid", string) = 0(意外使用赋值而不是比较)不会编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2014-11-30
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多