模拟器/生成的开关语句范围,单位为c
在ac(99?)或Objective C switch语句中是否存在支持范围情况的hack? 我知道不支持写这样的东西:
switch(x) case 1: case 2..10: case 11:
但我认为应该有一种使用#define宏生成代码的方法。 当然我可以用一个案例列表来定义一个宏,但我希望有更优雅的方式,如CASERANGE(x,x + 10),它会生成:
case x case x+1 case x+2
它甚至可能吗?
GCC有一个C语言的扩展 ,允许类似于你的第一个例子,但除此之外,如果有一个可移植/ ANSI的方式,它现在已经完成。 我不相信有一个。
使用宏执行此操作几乎或不可能。 存在编译器扩展,但它们是特定于编译器的,而不是跨平台/标准的。 没有标准的方法可以做到这一点,而是使用if / else链。
在现代C(C99,具有可变长度宏)中,可以使用宏来执行此操作。 但你可能不想自己完全编码。 P99为此提供了一个工具箱。 特别是有一个元宏P99_FOR
允许您展开有限长度的参数列表。
#define P00_CASE_FL(NAME, X, I) case I: NAME(X); break #define CASES_FL(NAME, ...) P99_FOR(NAME, P99_NARG(__VA_ARGS__), P00_SEQ, P00_CASE_FL, __VA_ARGS__)
将CASES_FL(myFunc, oi, ui, ei)
扩展为类似的东西
case 0: myFunc(oi); break; case 1: myFunc(ui); break; case 2: myFunc(ei); break
编辑:回复具体问题
#define P00_CASESEP(NAME, I, X, Y) X:; Y #define P00_CASERANGE(NAME, X, I) case ((NAME)+I) #define P99_CASERANGE(START, LEN) P99_FOR(START, LEN, P00_CASESEP, P00_CASERANGE, P99_REP(LEN,))
其中P00_CASESEP
只确保有:;
在两种情况之间, P99_REP
生成一个带有LEN
空参数的列表。
你可以用它作为
switch(i) { P99_CASERANGE('0',10): return i; }
观察:
在宏之后使其尽可能接近通常的case语法,并且LEN
参数必须扩展为普通的十进制数,而不是表达式。