char数组上的C/C++开关案例

i_w*_*arn 7 c arrays casting switch-statement

我有几个数据结构,每个数据结构有4个字节的字段.

由于int我的平台上4个字节等于1 ,我想在case标签中使用它们:

switch (* ((int*) &structure->id)) {
   case (* ((int*) "sqrt")): printf("its a sqrt!"); break;
   case (* ((int*) "log2")): printf("its a log2!"); break;
   case (((int) 'A')<<8 + (int) 'B'): printf("works somehow, but unreadable"); break;
   default: printf("unknown id");
}
Run Code Online (Sandbox Code Playgroud)

这会导致编译错误,告诉我case表达式不会减少到int.

我如何使用有限大小的char数组,并将它们转换为数值类型以用于switch/ case

Ste*_*e-o 5

遵循使用 FourCC 代码进行视频编码的确切方法:

在 C++ 中设置 FourCC 值

#define FOURCC(a,b,c,d) ( (uint32) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)) )
Run Code Online (Sandbox Code Playgroud)

为每个标识符使用枚举类型或宏可能是个好主意:

enum {
    ID_SQRT = FOURCC( 's', 'q', 'r', 't'),
    ID_LOG2 = FOURCC( 'l', 'o', 'g', '2')
};

int structure_id = FOURCC( structure->id[0], 
                           structure->id[1],
                           structure->id[2],
                           structure->id[3] );
switch (structure_id) {
case ID_SQRT: ...
case ID_LOG2: ...
}
Run Code Online (Sandbox Code Playgroud)


Seb*_*ach 2

免责声明:除娱乐或学习目的外,请勿使用此工具。对于严肃的代码,请使用常见的习惯用法,在一般情况下永远不要依赖编译器的特定行为;如果无论如何这样做,不兼容的平台应该触发编译时错误或使用良好的通用代码。


似乎标准允许根据语法使用多字符字符常量。尚未检查以下内容是否真的合法。

~/$ cat main.cc

#include <iostream>

#ifdef I_AM_CERTAIN_THAT_MY_PLATFORM_SUPPORTS_THIS_CRAP
int main () {
    const char *foo = "fooo";
    switch ((foo[0]<<24) | (foo[1]<<16) | (foo[2]<<8) | (foo[3]<<0)) {
    case 'fooo': std::cout << "fooo!\n";  break;
    default:     std::cout << "bwaah!\n"; break;
    };
}
#else
#error oh oh oh
#endif

~/$ g++ -Wall -Wextra main.cc  &&  ./a.out
main.cc:5:10: warning: multi-character character constant
fooo!
Run Code Online (Sandbox Code Playgroud)

编辑:哦,看,语法摘录正下方有2.13.2 字符文字项目符号 1

[...] 包含多个 c-char 的普通字符文字是多字符文字。多字符文字具有 int 类型和实现定义的值。

但在第二个项目符号中:

[...] 包含多个 c 字符的宽字符文字的值是实现定义的。

所以要小心。