我正在关注HandmadeHero系列,并且在视频中没有出现的switch语句中我得到了一些奇怪的行为。它很可能是添加到VS2015 Community Edition编译器的东西。 加载.wav文件的代码(来自Day 138的视频在00:18:00左右)出现问题。
对于RIFF format 中的不同块类型,定义了enum
:
#define RIFF_CODE(a, b, c, d) (((uint32)(a) << 0) || ((uint32)(b) << 8) || ((uint32)(c) << 16) || ((uint32)(d) << 24))
enum /*!< listing of different possible chunk IDs */
{
WAVE_ChunkID_fmt_ = RIFF_CODE('f', 'm', 't', ' '), /**< standard sub-chunk id */
WAVE_ChunkID_data = RIFF_CODE('d', 'a', 't', 'a'), /**< data chunk */
WAVE_ChunkID_RIFF = RIFF_CODE('R', 'I', 'F', 'F'), /**< RIFF chunk id */
WAVE_ChunkID_WAVE = RIFF_CODE('W', 'A', 'V', 'E'), /**< WAVE chunk id */
};
在实际的文件加载代码中有一个switch
- 语句:
uint32 ChunkType = GetType(Iter);
switch(ChunkType)
{
case WAVE_ChunkID_fmt_:
{
WAVE_fmt* fmt = (WAVE_fmt*)GetChunkData(Iter);
break;
}
case WAVE_ChunkID_data:
{
SampleData = (int16*)GetChunkData(Iter);
break;
}
}
第case WAVE_ChunkID_data:
行给出了错误代码
> w:\code\handmade_asset.cpp(270): error C2196: case value '1' already
> used
有人可以知道那里发生了什么?正如我所提到的,视频中使用了相同的代码(我也可以访问Casey的实际代码),并且视频中不会出现错误。
谢谢:)
答案 0 :(得分:4)
#define RIFF_CODE(a, b, c, d) (((uint32)(a) << 0) || ((uint32)(b) << 8) || ((uint32)(c) << 16) || ((uint32)(d) << 24))
上面的宏使用了逻辑OR运算符。因此,当转换为整数时,结果将始终为0或1。我认为这是一个错字,目的是写如下:
#define RIFF_CODE(a, b, c, d) (((uint32)(a) << 0) | ((uint32)(b) << 8) | ((uint32)(c) << 16) | ((uint32)(d) << 24))
现在它实际上预先形成了其参数的按位组合。