我试图编译下面的代码。
但是,在iteminfo字段、weaponifo字段和projectleinfo字段定义的每一行上,除了在每个“{null,0,0}”的最后一行之外,我得到了一个错误:“初始化值必须是常量表达式。”
我猜是来自iteminfos廑ofs()、weapon廑ofs()、projection廑ofs()。
我试着理解这三句话:
#定义武器数量(x)(尺寸)&((武器信息)0)—>x)
#定义射弹(x)(大小t)&((projectleinfo)0)—>x)
#定义项信息(x)(大小)&((项信息*)0)—>x)
但是,我真的不明白他们是怎么工作的…????
我需要帮助解剖它们。有人能读懂并重写成更简单的形式吗?
#定义武器数量(x)(尺寸)&((武器信息)0)—>x)
#定义射弹(x)(大小t)&((projectleinfo)0)—>x)
#定义项信息(x)(大小)&((项信息*)0)—>x)
字段定义项目信息字段[]=
{
{“名称”,iteminfos(名称),ft_string},
{“model”,iteminfos(model),ft_string},
{“模型索引”,iteminfos(模型索引),ft_int},
{“类型”,iteminfos(类型),ft_int},
{“索引”,iteminfos(索引),ft_int},
{“重生时间”,iteminfof(重生时间),ft_float},
{“分钟”,iteminfofs(分钟),ft_u float ft_u数组,3},
{“maxs”,iteminfos(maxs),ft_u float ft_u数组,3},
{NULL,0, 0 }
};
//武器定义
静态字段定义武器信息字段[]=
{
{“number”,武器数量(number),ft_int},//武器数量
{“name”,武器的名称,ft_string},//武器的名称
{“等级”,武器等级,英尺积分},
{“model”,武器的型号,字符串,///武器的型号
{“武器索引”,武器索引,ft_int},//库存武器索引
{“flags”(旗子),武器ofs(旗子),ft_int},//特殊旗子
{“射弹”,武器ofs(射弹),ft_string},//武器使用的射弹
{“射弹”,武器(射弹),ft_int},//射弹数量
{“hspread”,武器(hspread),浮点数},//射弹的水平分布(从中间的度数)
{“vSpread”,武器(vSpread),浮点数},//弹丸的垂直扩散(从中间的度数)
{“速度”,武器速度,浮子速度,//弹丸速度(0=瞬间命中)
{“加速度”,武器的加速度,浮子,//“加速度”*时间(秒)+“速度”=射弹速度
{“反冲”,武器反冲,浮动,3},//玩家从武器中获得的反冲量
{“偏移”,武器OFS(偏移),ft_u float_f_u数组,3},//相对于视角和视角的射弹起始偏移
{“angeloffset”,武器OFS(angeloffset),ft_u float_ft_u array,3},//射击角度相对于视角的偏移
{“超重力”,武器(超重力),浮子,},//弹丸获得的额外z速度
{“弹药数量”,武器数量(弹药数量),ft_int},///每次射击使用的弹药数量
{“弹药索引”,武器索引(弹药索引),ft_int},///库存弹药索引
{“activate”(激活),武器的(激活),浮点数},//选择武器所需的时间
{“重新加载”,武器(重新加载),浮点数},//重新加载武器所需的时间
{“spinup”,武器(spinup),浮点数},//第一次射击前的时间
{“减速”,武器(减速),浮动,},//武器停止射击前所需的时间
{空,0,0,0}
};
//射弹定义
静态字段定义项目信息字段[]=
{
{“name”,抛射物(name),ft_string},//抛射物的名称
{“model”,武器ofs(model),ft_string},//弹丸模型
{“flags”,抛射ofs(flags),ft_int},//special flags
{“重力”,抛射物(重力),ft_float},//施加到抛射物上的重力量[0,1]
{“损害”,抛射物的损害,ft_int},//抛射物的损害
{“半径”,抛射物的半径,浮点数},//损伤半径
{“visdamage”,投射物(visdamage),ft_int},//投射物对可见实体的伤害
{“损坏类型”,抛射物(损坏类型),ft_int},//损坏类型(损坏类型的组合)?标志)
{“healthinc”,抛射物(healthinc),ft_int},///所有者获得的健康增加
{“push”,抛射物(push),ft_float},//玩家从抛射物撞击中被推开的量
{“爆轰”,抛射物(爆轰),浮子,},//弹射物压后爆炸前的时间
{“bounce”,抛射物(bounce),ft_float},//抛射物反弹的量
{“反弹”(bouncefraic),投射物(反弹),ft_float},///每次反弹减少的反弹量
{“bouncestop”,抛射物(bouncestop),ft_float},//弹跳停止前的最小弹跳值
//recrive射弹定义??
{空,0,0,0}
};
注:
我现在的情况有点复杂。然而,
我不知道编译器的名字。环境是linux-tho。
这不是我的代码,但我需要编译它。
最佳答案
宏试图从包含该成员的结构的开头提取命名成员的偏移量。
而不是WEAPON_OFS(name)
对其他宏使用offsetof(weaponinfo_t,name)
-和类似的命令。
编辑:宏的实际功能。
#define WEAPON_OFS(x) (size_t)&(((weaponinfo_t *)0)->x)
此宏“假装”在地址0处有一个
weaponinfo_t
结构,并获取此weaponinfo_t
结构的特定成员的地址。这将产生从结构位置(0)到成员变量位置(0或更高)的偏移量作为指针。指针然后被转换为一个整数,它仍然是从结构开始到成员变量开始的距离-结构中成员变量的偏移量。显然您的编译器无法解析这个compiletime(虽然完全有可能解析),所以您得到的是一个错误,而不是初始值设定项所需的常量值。
关于c - 我需要重写这一行代码,并且需要帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5650900/