切换陈述案例' 1'已经在使用 - HandmadeHero 138

时间:2017-03-01 23:27:48

标签: c switch-statement

我正在关注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的实际代码),并且视频中不会出现错误。

谢谢:)

1 个答案:

答案 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))

现在它实际上预先形成了其参数的按位组合。