在Switch语句之前的预期表达式

时间:2011-03-02 05:09:13

标签: objective-c c

我在这段代码中遇到了编译错误:

switch(event) {
    case kCFStreamEventHasBytesAvailable:
        UInt8 buf[BUFSIZE];
        CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZE);
        if (bytesRead > 0) {
            handleBytes(buf, bytesRead);
        }
        break;
    case kCFStreamEventErrorOccurred:
        NSLog(@"A Read Stream Error Has Occurred!");
    case kCFStreamEventEndEncountered:
        NSLog(@"A Read Stream Event End!");
    default:
        break;
}

UInt8 buf[BUFSIZE];导致编译器抱怨“UInt8之前的预期表达式”为什么?

谢谢!

1 个答案:

答案 0 :(得分:16)

Switch语句不会引入新的范围。更重要的是,根据C语言规范,常规语句必须遵循case语句 - 不允许变量声明。您可以在变量声明之前放置;,编译器会接受它,但您定义的变量将在switch的父级范围内,这意味着您无法在另一个case语句中重新声明该变量。

通常,当一个人在case语句中定义变量时,会为case语句引入一个新的范围,如

switch(event) {
    case kCFStreamEventHasBytesAvailable: {
        // do stuff here
        break;
    }
    case ...
}