在C语言中,可以在第一个case
标签之前编写代码。有没有什么情况下这样做是有用的,或者它只是一个“死代码块”?
例如:
switch (...) {
{
int a = 0x2a;
printf("%d\n", a);
}
case 0:
...
}
发布于 2010-01-20 21:11:04
声明作用域限于switch
块的变量可能很有用(但请注意,这些变量的任何初始化器都将被跳过):
switch (...)
{
int n;
case 0:
...
}
从理论上讲,您还可以将使用goto
的代码放在那里。
发布于 2010-01-20 20:54:37
我认为这与其说是一个特性,不如说是C如何对待switch
/case
-as的一个工件,它只是一系列没有语法限制的跳转目标。这就是Duff's device能够工作的原因,也是第一个case
之前的代码永远不会运行的原因。
如果您查看生成的程序集,您将看到代码将被跳过:
mov ecx, DWORD PTR _x$[ebp]
mov DWORD PTR tv64[ebp], ecx
cmp DWORD PTR tv64[ebp], 0 ; here begins the switch
je SHORT $LN1@main ; jump to case 0
jmp SHORT $LN4@main ; jump out of the switch
; Line 8
mov DWORD PTR _a$752[ebp], 42
; Line 9
mov edx, DWORD PTR _a$752[ebp] ; here we have the dead code
push edx
push OFFSET $SG754
call _printf
add esp, 8
$LN1@main: ; and here case 0
; Line 12
push OFFSET $SG756
call _printf
add esp, 4
$LN4@main:
; Line 15
xor eax, eax
mov esp, ebp
pop ebp
ret 0
发布于 2010-01-20 21:09:21
我不明白你想要什么。为什么不直接把代码放在案例之前呢?
int a = 0x2a;
printf("%d\n", a);
switch (...) {
case 0:
...
}
这不是和你想要的一样吗?(除了在您的示例中,如果编译器没有错误,代码将永远不会运行。)
https://stackoverflow.com/questions/2101393
复制相似问题