宏如何根据传递给它的类型定义有效的全局名称?

2024-02-12

我相信标题是不言自明的,但这里有一个例子来说明我想要实现的目标:

#define PASTE2(_0, _1)  _0 ## _1

#define DEFINE_OPS_FOR_TYPE(TYPE)                   \
    int PASTE2(do_something_with_, TYPE)(void) {    \
        /* do_something_with_<TYPE> */              \
    }

一切正常char, int和单字类型,但是当它 来到unsigned类型或其他具有多个关键字的类型,使用标记粘贴(a ## b) 由于空格而不会生成有效名称(例如:do_something_with_foo bar).

我能想到的最简单的解决方案是改变DEFINE_OPS_FOR_TYPE宏 采用有效名称作为第二个参数。例如:

#define DEFINE_OPS_FOR_TYPE(TYPE, NAME_FOR_TYPE)            \
    int PASTE2(do_something_with_, NAME_FOR_TYPE)(void) {   \
        /* do_something_with_<NAME_FOR_TYPE> */             \
    }

这按预期工作,但我对其他可能的解决方案感到好奇,即使它们过于复杂。我想用_Generic,但我不明白它对定义名称有什么帮助。

你能想到另一个解决方案吗?


在您想要执行的符号的声明或定义级别上,没有太多出路typedef将事物转换为相关类型的唯一标识符。_Generic或等效的替换启动得太晚,对预处理器没有用处。

但只有有限数量的标准类型会造成这样的问题。所以你可以很容易地想出一个对它们进行类型定义的约定。

Where _Generic可以帮忙的是usage你这样定义的符号的一侧。然后你可以在这里做类似的事情

_Generic((X),
  unsigned long: do_something_with_ulong,
  unsigned char: do_something with_uchar,
  ...
)(X)

In P99 http://p99.gforge.inria.fr我遵循这个方案,你会发现很多支持宏已经就位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

宏如何根据传递给它的类型定义有效的全局名称? 的相关文章

随机推荐