不使用_Generic(C11),C99如何键入通用宏?

特雷弗·希基(Trevor Hickey)

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

我知道如何使用泛型选择来实现它
但是_Generic直到C11才存在。

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

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

基思·汤普森(Keith Thompson)

不使用_Generic(C11),C99如何键入通用宏?

非便携式的。

没有通用的方法可以在C11 C之前的版本中编写类型通用宏。

例如,如果您查看tgmath.h作为glibc一部分提供标头,它就不会使用_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功能的编译器来编译旧代码

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不使用_Generic(C11),C99如何键入通用宏?

来自分类Dev

在C99中的宏中使用对与错

来自分类Dev

在C11匿名结构定义中使用宏

来自分类Dev

Clang无法编译c11程序,理由是“隐式声明在c99中是非法的”

来自分类Dev

为什么C99中的此语句在C11中有所更改?

来自分类Dev

为什么该程序可以在C11中正常编译而在C99中不能正常编译?

来自分类Dev

使用C99之前的编译器构建C迭代器宏

来自分类Dev

使用C99之前的编译器构建C迭代器宏

来自分类Dev

如何检索C99可变参数宏的最后一个参数?

来自分类Dev

如何检索C99可变参数宏的最后一个参数?

来自分类Dev

使用C99的Netbeans C GCC

来自分类Dev

在C99中使用和不使用&打印指针之间的区别

来自分类Dev

C99是否允许标识符中使用通用字符名称?

来自分类Dev

在C99 7.19 / C11 7.21中,“必须是指向字符类型数组的初始元素的指针”是什么意思?

来自分类Dev

(C99)在另一个宏中展开一个宏

来自分类Dev

如何在Code :: Blocks中使用C11标准

来自分类Dev

C11可选功能宏在哪里?

来自分类Dev

如何使自动工具生成的./configure增强C11的_Generic的可用性?

来自分类Dev

C11 _Generic:如何处理字符串文字?

来自分类Dev

如何在没有警告的情况下在C99中使用ftruncate

来自分类Dev

C11:对类型本身(而不是类型实例)使用`_Generic()`(或其他方式)吗?

来自分类Dev

在C11中使用strdup

来自分类Dev

C11 _Generic()表达式如果嵌套则失败

来自分类Dev

是否有预处理器宏可跨平台检测C99?

来自分类Dev

C99指定的初始值设定项还是CGMake宏?

来自分类Dev

是否有预处理器宏可跨平台检测C99?

来自分类Dev

C99指定的初始化程序还是CGMake宏?

来自分类Dev

这个 C99 IS_LITTLE_ENDIAN 宏可移植吗?

来自分类Dev

使用ISO C99进行咖喱/装订

Related 相关文章

  1. 1

    不使用_Generic(C11),C99如何键入通用宏?

  2. 2

    在C99中的宏中使用对与错

  3. 3

    在C11匿名结构定义中使用宏

  4. 4

    Clang无法编译c11程序,理由是“隐式声明在c99中是非法的”

  5. 5

    为什么C99中的此语句在C11中有所更改?

  6. 6

    为什么该程序可以在C11中正常编译而在C99中不能正常编译?

  7. 7

    使用C99之前的编译器构建C迭代器宏

  8. 8

    使用C99之前的编译器构建C迭代器宏

  9. 9

    如何检索C99可变参数宏的最后一个参数?

  10. 10

    如何检索C99可变参数宏的最后一个参数?

  11. 11

    使用C99的Netbeans C GCC

  12. 12

    在C99中使用和不使用&打印指针之间的区别

  13. 13

    C99是否允许标识符中使用通用字符名称?

  14. 14

    在C99 7.19 / C11 7.21中,“必须是指向字符类型数组的初始元素的指针”是什么意思?

  15. 15

    (C99)在另一个宏中展开一个宏

  16. 16

    如何在Code :: Blocks中使用C11标准

  17. 17

    C11可选功能宏在哪里?

  18. 18

    如何使自动工具生成的./configure增强C11的_Generic的可用性?

  19. 19

    C11 _Generic:如何处理字符串文字?

  20. 20

    如何在没有警告的情况下在C99中使用ftruncate

  21. 21

    C11:对类型本身(而不是类型实例)使用`_Generic()`(或其他方式)吗?

  22. 22

    在C11中使用strdup

  23. 23

    C11 _Generic()表达式如果嵌套则失败

  24. 24

    是否有预处理器宏可跨平台检测C99?

  25. 25

    C99指定的初始值设定项还是CGMake宏?

  26. 26

    是否有预处理器宏可跨平台检测C99?

  27. 27

    C99指定的初始化程序还是CGMake宏?

  28. 28

    这个 C99 IS_LITTLE_ENDIAN 宏可移植吗?

  29. 29

    使用ISO C99进行咖喱/装订

热门标签

归档