怎样检测是否包含某函数(比如 sincos)?
要同时算一个弧度的正、余弦值:void sincos(double AngleInRadians, double *pSinAns, double *pCosAns);
部分编译平台,提供了该函数调用;
部分没有(比如 VC),因该函数非标准,倒也无可厚非。
在 C++ 代码中,如何自动检测:系统是否已提供该函数? Linux可用autoconfig工具定制 一个 configure 脚本,该脚本在编译期检测头文件和函数定义生成一些宏。在CPP中,使用条件编译,如果有这个宏,就使用这个函数,如果没有就不使用这个函数。我现在主要使用cmake创建makefile,关于autoconfig/automake的用法,应该有更专业的人能帮到你。 我暂时用条件编译“#ifdef sincos”来判断,但感觉非正规,因为我想判断的是是否声明了一个“函数”,而非“宏” 我看了下GMP检测系统是否存在fscanf是在 configure.ac, 2747 行这么定义 的
AC_CHECK_DECLS()
AC_CHECK_DECLS(, , ,
[#include <stdio.h>
#include <errno.h>])
所以 sin 和cos是不是也可以这样呢
===============
如果是cmake管理的工程, 可以用
include(CheckSymbolExists)
check_symbol_exists(sin "math.h" HAVE_SIN_MATH)
check_symbol_exists(cos "math.h" HAVE_COS_MATH)
哦,我说的是 sincos(),它是非标函数; 而 sin()、cos() 是标准函数 一样的,刚才测试通过了.
include(CheckSymbolExists)
check_symbol_exists(sincos "math.h" HAVE_SINCOS_MATH)
查了下 https://linux.die.net/man/3/sincos.发现只需要 #define _GNU_SOURCE, 判定是GNU就可以了.
GMP的configure脚本里面是写了一个最简单的带cos的函数的例子,然后configure的时候,测试gcc编译链接这个最小代码是否成功, 成功说明存在cos函数,否则就不存在. 谢谢!暂时用 7# 的方案替代。
不过,最好是有 C++ 标准的写法,比如通过 constexpr if之类去判断,进行代码分支。
这样,通过解决一个问题,get 一个新技能。 最笨的办法,就是你自己把这个函数重新自己实现一下,
这样就不用检测了!
最笨的办法就是最好的办法!
页:
[1]