【问题标题】:ISO C90/99 Check if compiler specific function existsISO C90/99 检查编译器特定函数是否存在
【发布时间】:2014-02-20 10:52:05
【问题描述】:

所以我正在编写可移植的嵌入式 ansi C 代码,它试图支持多个编译器和硬件目标。每个编译器/硬件供应商都支持不同的 math.h 函数。有些仅支持 C90,有些支持 C99 的子集,有些则支持全套 C99。

我正在尝试寻找一种方法来检查在预处理器期间是否存在给定函数,以便在不存在时使用自定义宏。一些供应商在 math.h 中有外部函数,一些使用 #define 重新映射到一些内部调用。是否有一段代码可以判断它是#defined 还是外部函数?我可以使用#ifdef 进行定义,但是实际的函数调用呢?

【问题讨论】:

  • 检查编译器是否支持C99你满意吗?
  • 您需要autoconf。是的,使用它有点让人头疼,但它是这项特定工作存在的最佳工具。 (它为您实现了 keshlam 建议的“编写一系列测试 .c 文件、编译它们、查看返回的错误代码并设置适当的 -D 标志”的过程。)
  • 您也可以使用CMake,它是autoconf 的更好替代品,因为它是可移植的。使用起来也很简单
  • @user9000:CMake 不是更好的选择。它不是可移植的,它有很多丑陋的硬编码假设和黑客,而不是正确的检查。这不会使 autoconf,事实上 autoconf 脚本也经常做错检查,但至少使用 autoconf 有可能正确检查。请参阅我的博客文章ewontfix.com/13
  • @YuHao 不,有些编译器声称支持 C99,但没有所有的库,它们只支持 C99 编码语法。

标签: c


【解决方案1】:

通常的解决方案是查看由预处理器本身定义的宏,或者作为 -D 定义传递到构建过程中,它标识您正在运行的编译器和平台,并使用这些以及您对什么的了解每个环境需要特殊协助来配置您的代码。

我想您可以编写一系列测试 .c 文件,尝试编译它们,查看返回的错误代码,并使用这些代码设置适当的 -D 标志...但我不相信那会是任何清洁剂。

【讨论】:

  • 如果 OP 最终编写了一个检查脚本,而不是使用现有的 autoconf 配方或类似的,请考虑我在这里介绍的问题:ewontfix.com/13
猜你喜欢
  • 2012-01-05
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
相关资源
最近更新 更多