2014-02-20 38 views
0

因此,我正在编写可移植嵌入式ANSI C代码,试图支持多个编译器和硬件目标。每个编译器/硬件供应商都支持不同的math.h函数。有的只支持C90,有的支持C99的子集,有的支持C99的全套。ISO C90/99检查是否存在编译器特定功能

我试图找到一种方法来检查预处理器中是否存在给定函数,以便我可以使用自定义宏如果它不存在。有些供应商在math.h中有外部函数,有些使用#define重新映射到某个内部调用。是否有一段代码可以判断它是否为#defined或extern函数?我可以使用#ifdef作为定义,但实际的函数调用呢?

+0

是否检查编译器是否支持C99满足您? –

+2

您需要['autoconf'](http://www.gnu.org/software/autoconf/)。是的,这与合作是一种痛苦,但它是这项具体工作的最佳工具。 (它为您实现了“编写一系列测试.c文件,编译它们,查看返回的错误代码,并设置keshlam建议的相应-D标志”的过程。) – zwol

+0

您也可以使用[CMake]( http://www.cmake.org/),这是'autoconf'的更好选择,因为它是可移植的。它也很容易使用 – 2014-02-20 03:15:44

回答

0

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

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

+0

如果OP最终编写了一个检查脚本而不是使用现有的autoconf配方或类似工具,请考虑问题I覆盖此处:http://ewontfix.com/13/ –

相关问题