2011-01-13 78 views
0

在c(99?)或目标C开关语句中是否存在破解以支持范围大小写? 我知道这是不支持写的东西是这样的:模拟器/生成的开关语句范围c

switch(x) 
    case 1: 
    case 2..10: 
    case 11: 

但我想应该有生成#define宏代码的方式。当然 我可以定义与案件列表中选择宏,但我希望有更优雅的方式像 CASERANGE(X,X + 10),这将产生:

case x 
case x+1 
case x+2 

是它甚至可能吗?

+0

为什么在那里有两个'case 1'?第二个是'case 11'吗? – BoltClock 2011-01-13 13:23:40

+1

为什么不简单地使用`if`语句呢? – 2011-01-13 13:27:39

+0

第二个是错字。如果陈述不能解决问题。我仍然必须全部写下。无论如何,我认为切换语句更清晰,以根据情况进行阅读。 – CodeFlakes 2011-01-13 13:34:45

回答

3

GCC有一个extension to the C language,允许类似于你的第一个例子,但除此之外,如果有一个可移植的/ ANSI的方式做到这一点,它现在已经完成了。我不相信有一个。

2

用宏做这件事接近或不可能。编译器扩展存在,但它们是编译器特定的,而不是跨平台/标准的。没有标准的方法来做到这一点,使用if/else链来代替。

2

在现代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; 
} 

观察:宏后保持它尽可能接近到通常情况下的语法,并且也认为LEN参数具有扩大到纯小数数字,而不是表达式等等。