将字符串扩展为关键字

马洛拉320

我正在编写一个程序,该程序struct需要存储有关它所持有的类型的信息。数据在结构内部表示为指向void的指针。我的意思的简短示例:

#include <stdio.h>

struct foo {
    void *data;
    char *type;
};

int main() {
    struct foo bar = {{'a', 'b', 'c'}, "char"};
    printf("%s\n", (STRING_TO_TYPE(bar.type))bar.data);
    return 0;
}

我需要的实现STRING_TO_TYPE,将取代宏"char"char所有这些都可以在编译时根据我的程序的需要进行评估。
我想做的是保存任何类型的对象,因此使用enumor或检查字符串是否相等将不起作用。

洪扎兰斯

简短的回答:这是不可能的。不是你的方式。宏可以产生令牌(如果需要,可以使用关键字),但是不能将字符串转换为令牌。

也就是说,如果您追求的是真的

  1. 能够在代码struct中的void *某处定义其“类型”的a
  2. 能够从struct的名称中以关键字的形式访问该类型

那么您很可能最终会获得typeof这是一个GNU扩展,因此它仅在GCC中可用,但可以使用。

在此处的示例代码中,您将struct使用MYSTRUCT宏定义某种“类型”,并使用TYPE宏获取该类型。预定义的__COUNTER__可以防止重新定义类型(每种类型struct都是其自己的类型,请参见gcc -E参考资料),并且有MYSTRUCT的三个宏级别可用于对其进行适当的字符串化。

#include <stdio.h>

#define TYPE(x) typeof(x.type)

#define MYSTRUCT(name, type) MYSTRUCT_INTER(name, type, __COUNTER__)

#define MYSTRUCT_INTER(name, type, counter) MYSTRUCT_RAW(name, type, counter)

#define MYSTRUCT_RAW(xName, xType, xCounter) \
    struct mystruct_## xCounter { \
        void * data; \
        xType type; \
    } xName

int main(void) {
    MYSTRUCT(foo, int);
    foo.data = (void *)42;

    TYPE(foo) tmp = foo.data;    /* <-- Here, tmp is an int */
    printf("%d\n", tmp);

    MYSTRUCT(bar, int*);
    bar.data = &tmp;

    TYPE(bar) tmp2 = bar.data;    /* <-- Here, tmp2 is an int* */
    printf("%p\n", tmp2);

    MYSTRUCT(baz, char*);
    baz.data = "Hello world";
    printf("%s\n", (TYPE(baz))baz.data);
    /* ^Expands to (char *)   baz.data */
}

请注意,我仍然需要知道struct“类型”来确定printf()的格式代码,但是并没有要求解决此问题。

不要忘记进行编译-std=gnu**(您需要进行编译typeof

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

关键字搜索字符串

来自分类Dev

c#是否可以为字符串关键字创建扩展方法

来自分类Dev

运行“ runserver”时,Django“ __ init __()关键字必须为字符串”错误

来自分类Dev

OCaml测试字符串是否几乎为空或包含关键字

来自分类Dev

如何将关键字转换为字符串并保留冒号

来自分类Dev

如何使用Roslyn将C#关键字替换为字符串替换?

来自分类Dev

将固定和可变关键字的组合移到mysql中字符串的末尾

来自分类Dev

如何避免将href添加到字符串中的重叠关键字?

来自分类Dev

#!/ usr / bin / perl,如何将字符串中的关键字与数字匹配

来自分类Dev

配置单元查询:将字符串与关键字列表匹配

来自分类Dev

C#将包含'GO'关键字的字符串拆分为多个sql语句

来自分类Dev

如何让 ElasticSearch 将关键字视为字符串而不是日期

来自分类Dev

如何将字符串作为关键字参数传递给方法

来自分类Dev

用固定关键字分割字符串

来自分类Dev

从xml内容字符串访问关键字

来自分类Dev

如何按特定关键字分割字符串?

来自分类Dev

Groovy中带字符串的* in *关键字

来自分类Dev

从字符串中提取关键字:Javascript

来自分类Dev

Dart中的this关键字,字符串插值

来自分类Dev

多个条件if语句字符串关键字:in,而不是in

来自分类Dev

解析关键字输入的字符串,后跟内容

来自分类Dev

Android部分字符串关键字匹配

来自分类Dev

在使用的Android。载()关键字的字符串匹配

来自分类Dev

在字符串中的关键字之前删除“ \ n”

来自分类Dev

随机替换字符串中的关键字

来自分类Dev

字符串中的Django queryset关键字

来自分类Dev

用关键字匹配列表分割字符串?

来自分类Dev

Excel字符串相似度/关键字比较

来自分类Dev

检查关键字是否在字符串中

Related 相关文章

  1. 1

    关键字搜索字符串

  2. 2

    c#是否可以为字符串关键字创建扩展方法

  3. 3

    运行“ runserver”时,Django“ __ init __()关键字必须为字符串”错误

  4. 4

    OCaml测试字符串是否几乎为空或包含关键字

  5. 5

    如何将关键字转换为字符串并保留冒号

  6. 6

    如何使用Roslyn将C#关键字替换为字符串替换?

  7. 7

    将固定和可变关键字的组合移到mysql中字符串的末尾

  8. 8

    如何避免将href添加到字符串中的重叠关键字?

  9. 9

    #!/ usr / bin / perl,如何将字符串中的关键字与数字匹配

  10. 10

    配置单元查询:将字符串与关键字列表匹配

  11. 11

    C#将包含'GO'关键字的字符串拆分为多个sql语句

  12. 12

    如何让 ElasticSearch 将关键字视为字符串而不是日期

  13. 13

    如何将字符串作为关键字参数传递给方法

  14. 14

    用固定关键字分割字符串

  15. 15

    从xml内容字符串访问关键字

  16. 16

    如何按特定关键字分割字符串?

  17. 17

    Groovy中带字符串的* in *关键字

  18. 18

    从字符串中提取关键字:Javascript

  19. 19

    Dart中的this关键字,字符串插值

  20. 20

    多个条件if语句字符串关键字:in,而不是in

  21. 21

    解析关键字输入的字符串,后跟内容

  22. 22

    Android部分字符串关键字匹配

  23. 23

    在使用的Android。载()关键字的字符串匹配

  24. 24

    在字符串中的关键字之前删除“ \ n”

  25. 25

    随机替换字符串中的关键字

  26. 26

    字符串中的Django queryset关键字

  27. 27

    用关键字匹配列表分割字符串?

  28. 28

    Excel字符串相似度/关键字比较

  29. 29

    检查关键字是否在字符串中

热门标签

归档