【问题标题】:How did C99 do type generic macros without _Generic (C11)?C99 如何在没有 _Generic (C11) 的情况下键入泛型宏?
【发布时间】:2016-08-25 06:55:28
【问题描述】:

在查看sqrttgmath.h 函数时,
我看到 C99 有一个类型通用的宏。

我知道如何使用Generic selection 来实现它,
_Generic 直到 C11 才存在。

我们在 C89 和 C99 中有遗留项目。
如果可能的话,我想以类似的方式实现类型通用功能。

如何在没有泛型选择的情况下在 C 中编写类型泛型宏?

【问题讨论】:

  • 编译器及其 .h 文件可能使用 C 规范中不可用的选项。 IOWs,它不必遵守规则,我们这样做。

标签: c generics types macros c-preprocessor


【解决方案1】:

C99 如何在没有 _Generic (C11) 的情况下键入泛型宏?

不可携带。

在 C11 之前的 C 中没有通用的方法来编写泛型宏。

例如,如果您查看作为 glibc 的一部分提供的 tgmath.h 标头,它不会使用 _Generic(因为它需要与不支持 _Generic 的编译器一起使用)。相反,它使用了一些 gcc 特定的功能,例如包装在一些非凡的宏中的 __builtin_classify_type。文件顶部附近的评论说:

/* This is ugly but unless gcc gets appropriate builtins we have to do        
   something like this.  Don't ask how it works.  */

一些宏定义将sizeof (Val)(其中Val 是宏参数)与sizeof (double) 进行比较。如果 floatdoublelong double 的大小不同,这可能会失败。

整个事情都被包裹在:

#if __GNUC_PREREQ (2, 7)
/* a lot of ugly macro definitions */
#else
# error "Unsupported compiler; you cannot use <tgmath.h>"
#endif

您可能可以使用sizeof 将一些东西放在一起,但它会很丑。

您是否有机会使用支持 C11 或至少支持 _Generic 功能的编译器编译旧代码?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2021-12-09
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多