错误C2099:初始化程序不是常数&警告C4013:'gamma'未定义;假设extern返回int

时间:2013-11-09 13:00:56

标签: c

我正在尝试使用开源R树,但是我遇到了错误。我花了几个小时修理它但不能。请帮忙。 代码部分如下:

#include <stdio.h>
#include <math.h>


#ifndef M_PI
#   define M_PI 3.1415926535
#endif
#ifndef ABS
#   define ABS(a) ((a) > 0 ? (a) : -(a))
#endif

#define EP .0000000001

const double log_pi = log(M_PI);



double sphere_volume(double dimension)
{
    double log_gamma, log_volume;
    log_gamma = gamma(dimension/2.0 + 1);
    log_volume = dimension/2.0 * log_pi - log_gamma;
    return exp(log_volume);
}

我收到以下错误: 1&gt; c:\ users \ user \ desktop \ r \ gammavol.c(14):错误C2099:初始化程序不是常量 1&gt; c:\ users \ user \ desktop \ r \ gammavol.c(21):警告C4013:'gamma'未定义;假设extern返回int

第14行是const double log_pi = log(M_PI); 第21行是log_gamma = gamma(dimension / 2.0 + 1);

提前致谢

4 个答案:

答案 0 :(得分:0)

这两条错误信息非常清楚。

第一个说你不能用非常数值初始化变量。

虽然log(M_PI)确实是常量,但编译器不能这样对待它,因为它不知道函数log()是否总是返回相同的结果。确实如此,但编译器必须假定它没有,因此“非常数”。

第二个说你试图在这里调用的函数gamma没有定义。

因此,它假定它是extern int gamma()。由于不清楚此函数的声明位置,您至少应该包含包含其原型的相应头文件。

答案 1 :(得分:0)

此行是您第一次出错的原因:

const double log_pi = log(M_PI);

表达式log(M_PI)不是常量,不能在初始化中使用。请改为使用以下内容,或在main函数中移动定义并移除const

const double log_pi = 1.1447298858494002;

第二个错误是因为编译器找不到函数gamma。它似乎没有在math.h中定义。如果您没有收到链接器错误,我建议您添加:

double gamma (double);

正确的做法是找到要包含的正确头文件。 This question可以解释一下。

答案 2 :(得分:0)

log(M_PI)不是常量表达式,它是一个常量限定对象,在C语言术语中不是常量。为此,您需要声明一个命名常量,您应该使用#defineenum,而不是const限定符。 const double类型的变量不是C 中的常量。

#define log_pi log(M_PI)

答案 3 :(得分:0)

静态const需要在编译时初始化,你在那里放一个函数调用。像gcc这样的高级编译器无论如何都可以在编译时计算这样的东西,并且只会警告非法构造而不是错误。你的人显然没有能力做到这一点。

另一件事是gamma()不是标准的libmath函数,它们是你在BSD和Linux上找到的一些非标准的东西,但在你的Windows上没有(按你的路径名)。无论如何它已被弃用,{C}标准化为tgamma()lgamma()