Sinf - 它是否存在于C ++中?

时间:2012-02-01 04:20:04

标签: c++ math.h sin

我很想知道是否通过包含sinf在C ++中存在math.h函数。

在Qt Creator中查看我的自动完成时,它似乎不会弹出。这让我想知道,由于某种原因,它是否被取消了。 Google搜索似乎也没有提供很多引用;他们中的大多数是关于直C的。

那么,这可以证实吗?

2 个答案:

答案 0 :(得分:4)

这取决于您的实现支持的标准版本。

1990 {ISO}标准中不存在sinf函数(sind也没有)。唯一的sin函数是sin,它接受​​double参数并返回double结果。 (“未来图书馆方向”部分7.13确实说保留了名称后缀为fl的数学函数。)

1999年ISO C标准(C99)中添加了sinfsind功能。

2003版ISO C ++标准在第17.4.1.2节[lib.headers]中说:

  

除第18至27条所述外,每个标题的内容    cname 应与相应标题 name.h 的相同,如   ISO / IEC 9899:1990编程语言C(第7条)中规定的,或   ISO / IEC:1990编程语言-C修订1:C完整性,(条款   7),视情况而定,如同包含一样。

2011 ISO C ++标准(至少是N3290草案)包括以下作为规范性参考文献:

  • ISO / IEC 9899:1999,编程语言 - C
  • ISO / IEC 9899:1999 / Cor.1:2001(E),编程语言 - C,技术勘误1
  • ISO / IEC 9899:1999 / Cor.2:2004(E),编程语言 - C,技术勘误2
  • ISO / IEC 9899:1999 / Cor.3:2007(E),编程语言 - C,技术勘误3

因此,C ++实现符合早期的标准,C ++ 11无需提供sinf。目前尚不清楚是否允许这样做,但由于C ++ 11之前的所有标准都已正式废弃,这可能是一个没有实际意义的问题。

预C ++ 11实现可能会将sinf()和朋友作为(可能不符合的)扩展提供。

实际上,您可以随时拨打sin();在大多数情况下,参数和结果将从float隐式转换为double,从double隐式转换为float。可能(或可能不)会有一些效率损失。

答案 1 :(得分:1)

所有C函数都存在于C ++中,除非它们的头文件采用显式步骤来检查它是否是C ++编译器并在这种情况下隐藏定义。

所以是的,您可以像使用C语言一样使用C ++代码中的sinf。实际上,您可以(通过一些非常狭窄的例外)编写C90代码并将其传递给g++,称之为C ++。

编辑:sinf,至少在我的计算机上,math.h未公开,除非在包含该标题之前#define之一被_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L 曝光:

{{1}}

因此,在C ++代码中,您可能需要设置其中一个预处理器定义才能获得原型。