字符串数组上的C/C++开关案例

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

由于我的平台上4个字节等于1 int,我想在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");
}

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

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

解决方法

免责声明:除了娱乐或学习目的外,请勿使用此功能.对于严肃的代码,使用常用的习惯用法,在一般情况下从不依赖编译器特定的行为;如果完成,不兼容的平台应该触发编译时错误或使用良好的通用代码.

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

~/$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!

编辑:哦看,直接在语法摘录下面有2.13.2字符文字,子弹1:

[…] An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharac-
ter literal has type int and implementation-defined value.

但在第二个子弹中:

[…] The value of a wide-character literal containing multiple c-chars is implementation-defined.

所以要小心.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...