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
选项提供了在系统版本之前搜索<math.h>
的目录。
是的,你是对的,我使用的语言定义了它自己的 math.h,我将它包含在 -I$(heptc -where)/c/ 中,非常感谢,我想我可以解决这个问题问题知道(虽然不是因为这不是我的math.h)
是的,您的代码在 Ubuntu 上的系统 <math.h>
上运行良好,所以它必须是您自定义的 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 的问题的主要内容,如果未能解决你的问题,请参考以下文章