【发布时间】: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