hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 407|回复: 9

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

[复制链接]

523

主题

523

帖子

1599

积分

大司空

Rank: 5Rank: 5

积分
1599
发表于 2023-9-25 13:26:47 | 显示全部楼层 |阅读模式
要同时算一个弧度的正、余弦值:
  1. void sincos(double AngleInRadians, double *pSinAns, double *pCosAns);
复制代码
部分编译平台,提供了该函数调用;
部分没有(比如 VC),因该函数非标准,倒也无可厚非。

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

使用道具 举报

0

主题

186

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 13:27:14 | 显示全部楼层
Linux可用autoconfig工具定制 一个 configure 脚本,该脚本在编译期检测头文件和函数定义生成一些宏。在CPP中,使用条件编译,如果有这个宏,就使用这个函数,如果没有就不使用这个函数。我现在主要使用cmake创建makefile,关于autoconfig/automake的用法,应该有更专业的人能帮到你。
回复

使用道具 举报

1

主题

163

帖子

64

积分

关内侯

Rank: 2

积分
64
发表于 2023-9-25 13:27:37 | 显示全部楼层
我暂时用条件编译“#ifdef sincos”来判断,但感觉非正规,因为我想判断的是是否声明了一个“函数”,而非“宏”
回复

使用道具 举报

0

主题

178

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 13:28:03 | 显示全部楼层
我看了下GMP检测系统是否存在fscanf  是在 configure.ac, 2747 行这么定义 的
  1. AC_CHECK_DECLS([fgetc, fscanf, optarg, ungetc, vfprintf])AC_CHECK_DECLS([sys_errlist, sys_nerr], , ,[#include <stdio.h>#include <errno.h>])
复制代码
所以 sin 和cos是不是也可以这样呢

===============
如果是cmake管理的工程, 可以用
  1. include(CheckSymbolExists)check_symbol_exists(sin "math.h" HAVE_SIN_MATH)check_symbol_exists(cos "math.h" HAVE_COS_MATH)
复制代码
回复

使用道具 举报

0

主题

174

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 13:28:59 | 显示全部楼层
哦,我说的是 sincos(),它是非标函数; 而 sin()、cos() 是标准函数
回复

使用道具 举报

1

主题

186

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2023-9-25 13:29:55 | 显示全部楼层
一样的,刚才测试通过了.
  1. include(CheckSymbolExists)check_symbol_exists(sincos "math.h" HAVE_SINCOS_MATH)
复制代码
回复

使用道具 举报

0

主题

182

帖子

63

积分

关内侯

Rank: 2

积分
63
发表于 2023-9-25 13:30:01 | 显示全部楼层
查了下 https://linux.die.net/man/3/sincos.  发现只需要 #define _GNU_SOURCE  , 判定是GNU就可以了.
回复

使用道具 举报

0

主题

179

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 13:30:44 | 显示全部楼层
GMP的configure脚本里面是写了一个最简单的带cos的函数的例子[24058行],然后configure的时候,测试gcc编译链接这个最小代码是否成功, 成功说明存在cos函数,否则就不存在.
回复

使用道具 举报

0

主题

220

帖子

86

积分

关内侯

Rank: 2

积分
86
发表于 2023-9-25 13:31:30 | 显示全部楼层
谢谢!暂时用 7# 的方案替代。

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

使用道具 举报

0

主题

186

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 13:31:49 | 显示全部楼层
最笨的办法,就是你自己把这个函数重新自己实现一下,
这样就不用检测了!
最笨的办法就是最好的办法!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 21:28 , Processed in 0.060356 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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