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?
遵循使用 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)
免责声明:除娱乐或学习目的外,请勿使用此工具。对于严肃的代码,请使用常见的习惯用法,在一般情况下永远不要依赖编译器的特定行为;如果无论如何这样做,不兼容的平台应该触发编译时错误或使用良好的通用代码。
似乎标准允许根据语法使用多字符字符常量。尚未检查以下内容是否真的合法。
~/$ 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 字符的宽字符文字的值是实现定义的。
所以要小心。
| 归档时间: |
|
| 查看次数: |
12892 次 |
| 最近记录: |