gxqcn 发表于 2019-12-9 13:14:48

怎样检测是否包含某函数(比如 sincos)?

要同时算一个弧度的正、余弦值:
void sincos(double AngleInRadians, double *pSinAns, double *pCosAns);
部分编译平台,提供了该函数调用;
部分没有(比如 VC),因该函数非标准,倒也无可厚非。

在 C++ 代码中,如何自动检测:系统是否已提供该函数?

liangbch 发表于 2019-12-9 14:04:43

Linux可用autoconfig工具定制 一个 configure 脚本,该脚本在编译期检测头文件和函数定义生成一些宏。在CPP中,使用条件编译,如果有这个宏,就使用这个函数,如果没有就不使用这个函数。我现在主要使用cmake创建makefile,关于autoconfig/automake的用法,应该有更专业的人能帮到你。

gxqcn 发表于 2019-12-9 14:27:57

我暂时用条件编译“#ifdef sincos”来判断,但感觉非正规,因为我想判断的是是否声明了一个“函数”,而非“宏”

wayne 发表于 2019-12-9 15:14:01

我看了下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)

gxqcn 发表于 2019-12-9 15:46:54

哦,我说的是 sincos(),它是非标函数; 而 sin()、cos() 是标准函数

wayne 发表于 2019-12-9 15:57:26

一样的,刚才测试通过了.

include(CheckSymbolExists)
check_symbol_exists(sincos "math.h" HAVE_SINCOS_MATH)

wayne 发表于 2019-12-9 15:58:41

查了下 https://linux.die.net/man/3/sincos.发现只需要 #define _GNU_SOURCE, 判定是GNU就可以了.

wayne 发表于 2019-12-9 16:43:19

GMP的configure脚本里面是写了一个最简单的带cos的函数的例子,然后configure的时候,测试gcc编译链接这个最小代码是否成功, 成功说明存在cos函数,否则就不存在.

gxqcn 发表于 2019-12-10 07:58:24

谢谢!暂时用 7# 的方案替代。

不过,最好是有 C++ 标准的写法,比如通过 constexpr if之类去判断,进行代码分支。
这样,通过解决一个问题,get 一个新技能。

mathematica 发表于 2019-12-10 13:29:28

最笨的办法,就是你自己把这个函数重新自己实现一下,
这样就不用检测了!
最笨的办法就是最好的办法!
页: [1]
查看完整版本: 怎样检测是否包含某函数(比如 sincos)?