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

标签 c generics macros c11

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

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

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

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

我能想到的最简单的解决方案是更改 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 或等效替代品启动得太晚,对预处理器没有用处。

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

_Generic 可以提供帮助的是此类定义符号的使用方面。然后你可以在这里做类似的事情

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

P99我遵循这个方案,你会发现很多支持宏已经就位。

关于c - 宏如何根据传递给它的类型定义有效的全局名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137291/

相关文章:

java - 如何在 Java 中创建类型变量数组?

java - 泛型类的数组

c - 出现错误 : expected declaration specifiers or '...' before string constant

macros - 什么是宏@.来自 Julia,文档在哪里?

c - 程序在尝试对结构的指针成员进行 malloc 时出现段错误

c - execl 调用奇怪的行为

c - 当我重新分配一个更小的缓冲区时,它会删除缓冲区中的数据直到达到正确的大小吗?

c - 获取条件表达式的地址

泛型的 Java 简称

c++ - 如何在 C++ 中绕过 << 调用,就好像 "#ifndef DEBUG"宏一样?