首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误C2099:初始值设定项不是常量&警告C4013:'gamma‘未定义;假定外部返回整数

错误C2099:初始值设定项不是常量&警告C4013:'gamma‘未定义;假定外部返回整数
EN

Stack Overflow用户
提问于 2013-11-09 21:00:56
回答 4查看 365关注 0票数 2

我正在尝试使用一个开源的R树,但是我得到了错误。我花了几个小时来修复它,但没能解决。请帮帮忙。代码部分如下:

代码语言:javascript
运行
复制
#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>c:\users\user\desktop\r\gammavol.c(14):错误C2099:初始化器不是常量1>c:\users\user\desktop\r\gammavol.c(21):警告C4013:'gamma‘未定义;假设外部返回整数

第14行是常量双倍对数= log_pi (M_PI);第21行是log_gamma =gamma(尺寸/2.0+ 1);

提前感谢

EN

回答 4

Stack Overflow用户

发布于 2013-11-09 21:13:43

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

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

虽然log(M_PI)确实是常量,但编译器不能将其视为常量,因为它不知道函数log()是否总是返回相同的结果。它确实存在,但编译器必须假定它不存在,因此是“非常量”。

第二个示例说明您尝试在此处调用的函数gamma尚未定义。

因此,它假定它是一个extern int gamma()。由于不清楚此函数是在何处声明的,因此您至少应该包含包含其原型的适当头文件。

票数 0
EN

Stack Overflow用户

发布于 2013-11-09 21:17:08

这一行是导致第一个错误的原因:

代码语言:javascript
运行
复制
const double log_pi = log(M_PI);

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

代码语言:javascript
运行
复制
const double log_pi = 1.1447298858494002;

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

代码语言:javascript
运行
复制
double gamma (double);

正确的做法是找到要包含的正确的头文件。This question可能会带来一些启示。

票数 0
EN

Stack Overflow用户

发布于 2013-11-09 21:17:31

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

代码语言:javascript
运行
复制
#define log_pi log(M_PI)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19876243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档