找回密码
 欢迎注册
查看: 7875|回复: 9

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

[复制链接]
发表于 2019-12-9 13:14:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
要同时算一个弧度的正、余弦值:
  1. void sincos(double AngleInRadians, double *pSinAns, double *pCosAns);
复制代码

部分编译平台,提供了该函数调用;
部分没有(比如 VC),因该函数非标准,倒也无可厚非。

在 C++ 代码中,如何自动检测:系统是否已提供该函数?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 14:04:43 | 显示全部楼层
Linux可用autoconfig工具定制 一个 configure 脚本,该脚本在编译期检测头文件和函数定义生成一些宏。在CPP中,使用条件编译,如果有这个宏,就使用这个函数,如果没有就不使用这个函数。我现在主要使用cmake创建makefile,关于autoconfig/automake的用法,应该有更专业的人能帮到你。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-12-9 14:27:57 | 显示全部楼层
我暂时用条件编译“#ifdef sincos”来判断,但感觉非正规,因为我想判断的是是否声明了一个“函数”,而非“宏”
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 15:14:01 | 显示全部楼层
我看了下GMP检测系统是否存在fscanf  是在 configure.ac, 2747 行这么定义 的

  1. AC_CHECK_DECLS([fgetc, fscanf, optarg, ungetc, vfprintf])
  2. AC_CHECK_DECLS([sys_errlist, sys_nerr], , ,
  3. [#include <stdio.h>
  4. #include <errno.h>])
复制代码

所以 sin 和cos是不是也可以这样呢

===============
如果是cmake管理的工程, 可以用
  1. include(CheckSymbolExists)
  2. check_symbol_exists(sin "math.h" HAVE_SIN_MATH)
  3. check_symbol_exists(cos "math.h" HAVE_COS_MATH)
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-12-9 15:46:54 | 显示全部楼层
哦,我说的是 sincos(),它是非标函数; 而 sin()、cos() 是标准函数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 15:57:26 | 显示全部楼层
一样的,刚才测试通过了.

  1. include(CheckSymbolExists)
  2. check_symbol_exists(sincos "math.h" HAVE_SINCOS_MATH)
复制代码

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 15:58:41 | 显示全部楼层
查了下 https://linux.die.net/man/3/sincos.  发现只需要 #define _GNU_SOURCE  , 判定是GNU就可以了.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 16:43:19 | 显示全部楼层
GMP的configure脚本里面是写了一个最简单的带cos的函数的例子[24058行],然后configure的时候,测试gcc编译链接这个最小代码是否成功, 成功说明存在cos函数,否则就不存在.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-12-10 07:58:24 | 显示全部楼层
谢谢!暂时用 7# 的方案替代。

不过,最好是有 C++ 标准的写法,比如通过 constexpr if  之类去判断,进行代码分支。
这样,通过解决一个问题,get 一个新技能。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-10 13:29:28 | 显示全部楼层
最笨的办法,就是你自己把这个函数重新自己实现一下,
这样就不用检测了!
最笨的办法就是最好的办法!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 17:48 , Processed in 0.033599 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表