math.h 的问题

Posted

技术标签:

【中文标题】math.h 的问题【英文标题】:Issue with math.h 【发布时间】:2021-08-05 01:50:15 【问题描述】:

我的代码遇到了一个非常奇怪的问题。 我尝试使用 clang 和 gcc,两者都告诉我同样的事情

init_twiddle.c:12:10: warning: implicitly declaring library function 'cosf' with type 'float (float)' [-Wimplicit-function-declaration]
          .re = cosf(primitive_root*i) ,
                ^
init_twiddle.c:12:10: note: include the header <math.h> or explicitly provide a declaration for 'cosf'
init_twiddle.c:13:10: warning: implicitly declaring library function 'sinf' with type 'float (float)' [-Wimplicit-function-declaration]
          .im = sinf(primitive_root*i)
                ^
init_twiddle.c:13:10: note: include the header <math.h> or explicitly provide a declaration for 'sinf'
2 warnings generated.

代码:

// file: init_twiddle.c

#include "complex.h"
#include <math.h>

void init_twiddle1024(Complex__complex* twiddle) 
  int i,span ;
  // Init the twiddles
  for(span=1;span<=512;span<<=1) 
    float primitive_root = -Complex__pi/span ;
    for(i=0;i<span;i++) 
      Complex__complex t =
    
     .re = cosf(primitive_root*i) ,
     .im = sinf(primitive_root*i)
     ;
      twiddle[span+i] = t ;
    
  

// file: complex.h

#ifndef COMPLEX_H
#define COMPLEX_H

#include "stdbool.h"
#include "assert.h"
//#include "pervasives.h"
typedef struct Complex__complex 
  float re;
  float im;
 Complex__complex;

static const float Complex__pi = 3.141593;

#endif // COMPLEX_H

我用来编译的命令:

gcc -I. -I$(heptc -where)/c/ -std=c99 -c init_twiddle.c

我正在使用一些奇怪的编程语言来解释所有包含的目录。

有人知道我为什么会收到这些错误吗?

PS:请注意,这不是链接器问题,而是编译时的问题。 当我手动将 complex.h 的内容写入文件时,它似乎也没有出现

【问题讨论】:

我们需要足够的代码来重现错误。如果您可以在没有complex.h 的情况下复制它,请编辑您的问题。如果没有,请包含该代码。 您有自己的math.h 文件吗?您的-I 选项提供了在系统版本之前搜索&lt;math.h&gt; 的目录。 是的,你是对的,我使用的语言定义了它自己的 math.h,我将它包含在 -I$(heptc -where)/c/ 中,非常感谢,我想我可以解决这个问题问题知道(虽然不是因为这不是我的math.h) 是的,您的代码在 Ubuntu 上的系统 &lt;math.h&gt; 上运行良好,所以它必须是您自定义的 math.h 非常感谢您解决了我的问题,现在我只需要找到如何在不删除 -I 的情况下包含正确的 math.h 即可。另外我对堆栈溢出很陌生,我应该如何将此问题标记为已解决? 【参考方案1】:

事实证明,Barmar 是对的。我包括了一个已经存在 math.h 的目录,因此导致不包括 libc 。 对于那些对 Heptagon 语言有同样问题的人来说,错误的是 -I$(heptc -where)/c/。 感谢您的帮助。

【讨论】:

【参考方案2】:

正如@Barmar 所评论的,问题在于$(heptc -where)/c/ 中已经定义了一个math.h 标头,它没有实现您要在此示例中使用的功能。

考虑到它是用Heptagon 编译的,我建议从$(heptc -where)/c/ 复制在这种情况下真正有用的唯一文件,即pervasives.h,在那里你有你的init_twiddle.c,因为你正在用@987654325 编译@它会编译得很好。

【讨论】:

以上是关于math.h 的问题的主要内容,如果未能解决你的问题,请参考以下文章

math.h 的问题

mysql和math.h之间的冲突问题

我无法将我的 opengl 程序链接到 math3d.h

xCode math.h 中的 FLTK 错误

gcc不会正确包含math.h

C++数学函数题(Linux下)