编译错误

时间:2010-07-16 12:43:48

标签: c++ visual-studio-2008 winapi

我试图编译,但我得到这些错误:

1>.\item.cpp(123) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

1>.\commands.cpp(1372) : error C2057: expected constant expression
1>.\commands.cpp(1372) : error C2466: cannot allocate an array of constant size 0
1>.\commands.cpp(1372) : error C2133: 'buffer' : unknown size

第123行item.cpp

if((bool)random_range(0, 1))

第1372行commands.cpp

if(money < changeSexPrice)
{
char buffer[70 + changeSexPrice];
sprintf(buffer, "You do not have enough money. You need %d gold coins to change your sex.", changeSexPrice);
player->sendCancel(buffer);
return false;
}

任何想法?

3 个答案:

答案 0 :(得分:2)

您的问题是char buffer[70 + changeSexPrice];。在进行堆栈分配时,win32编译器需要一个常量表达式。

我不确定你为什么要添加changeSexPrice,因为你只使用缓冲区来打印int。我敢打赌,如果你选择char buffer[1024]这样的东西,那么你将有足够的需求。

编辑:根据评论(非常好)。

如果使用len 1024的固定大小缓冲区,请使用snprintf。在Visual Studio中,这是sprintf_s。您的代码将更改为:

sprintf_s(buffer, 1024, "You don't have enough money ...", yourValueHere);

或者,Mark B presents an answer也不需要你自己的内存分配。

答案 1 :(得分:1)

声明基于堆栈的可变长度数组是gcc扩展(也可能是其他扩展)。使用ostringstream进行格式化:

if(money < changeSexPrice)
{
    std::ostringstream os;
    os << "You do not have enough money. You need " << changeSexPrice << " gold coins to change your sex.";
    player->sendCancel(os.str().c_str());   // This assumes that sendCancel doesn't take ownership of its parameter.
    return false;
}

答案 2 :(得分:0)

if((bool)random_range(0, 1))

更好地写下:

if(random_range(0, 1) == 1)

这更清晰,警告将消失。