gpt4 book ai didi

C++ 开关 - 预处理案例参数?

转载 作者:行者123 更新时间:2023-11-30 03:01:45 28 4
gpt4 key购买 nike

在我的开关中,我希望案例从 0 变为 (number_of_cases-1),而无需自己编写数字。因此,如果我在中间删除一个 case block ,则以下 case 将重新编号(减 1),以便再次从 (0..caseNo-1) 切换。

像这样(当然它不会编译,因为 i++ 不知道编译时间):

#include <iostream>

#define ALWAYS_SECOND_CASE 1

void nop(char c){}

int main()
{
int i=0;
int var=ALWAYS_SECOND_CASE;

switch(var)
{
case i++: //case 0:
nop('x');
break;
case i++: //case 1:
nop('y')
break;
case i++: //case 2:
nop('z')
break;
}

//case 1 should have been switched to, nop('y') called.
}

现在我删除了中间的情况,并且不写任何东西,最后一个情况应该从情况 2 变为情况 1:

#include <iostream>

#define ALWAYS_SECOND_CASE 1

void nop(char c){}

int main()
{
int i=0;
int var=ALWAYS_SECOND_CASE;

switch(var)
{
case i++: //case 0:
nop('x');
break;
case i++: //case 1: instead of case 2 like before
nop('z')
break;
}

//case 1 should have been switched to, nop('z') called,
// instead of nop('y') like before.
}

所以我不能使用变量,因为它们太易变了;那么符号常量太常量了,我可以做SYMC+1,但是没有SYMC++。那么也许是枚举,或者一些不错的宏函数?

编辑感谢 if-else 提示,我只是认为由于 case 值在编译时是已知的,所以使用开关会更好..

并指定我想做什么:我有一个菜单 char[rows][cols]={"first line","second line"}。我想将 switch case 映射到行,这样如果我想从菜单中删除一行(在行号之后递减),我将只删除程序其余部分中的一个 case。

最佳答案

预处理器中没有状态保持结构。但是,在 C++11 中,您可以使用 lambda 表达式来表达各个情况,将它们放在一个数组中,并以类似于 switch 的方式使用,每个情况后都有中断:

function<void()> cases[] = {
[] () {cout << "quick" << endl; }
, [] () {cout << "brown" << endl; }
, [] () {cout << "fox" << endl; }
};
int k = 1;
cases[k](); // <<== This is where the switch happens

现在,每次您从中间删除一个案例时,您的数组索引都会自动“重新编号”。

关于C++ 开关 - 预处理案例参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765762/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com