Lỗi biên dịch với: switch, “biểu thức mong đợi trước đó”


79

Cắt theo đuổi, tôi đã tái tạo vấn đề của mình vì nó khá tự giải thích.

điều này tuân thủ mà không có lỗi:

switch (n) {
    case 1:
        NSLog(@"");
        NSString *aStr;
        break;
    default:
        break;
    }

điều này biên dịch với lỗi và nó chỉ thiếu NSLog ():

switch (n) {
    case 1:
        NSString *aStr;
        break;
    default:
        break;
    }

nó ném một lỗi khi biên dịch " Biểu thức mong đợi trước 'NSString' "

Am i thiếu cái gì ở đây?



Tôi nhớ một câu lệnh switch / trường hợp với một lỗi tương tự, nó được sử dụng để biến mất khi tôi thêm một nơi bình luận trong khối trường hợp .. ma thuật
Yunus Nedim Mehel

Câu trả lời:


164

Trong C thông thường, bạn phải đặt nó trong ngoặc trong cả hai trường hợp. Tôi nghi ngờ điều này có thể khắc phục sự cố của bạn:

case 1:
{
    NSLog(@"");
    NSString *aStr;
    break;
}

Xem câu hỏi SO này để biết thêm thông tin.

Một cách khác để giải quyết vấn đề này là đặt một câu lệnh giữa nhãn trường hợp và phần khai báo đầu tiên như bạn đã làm trong ví dụ làm việc ở trên. Xem các bình luận và câu trả lời của Quinn Taylor để biết thêm thông tin.


1
Hấp dẫn. Không thử cách tiếp cận dấu ngoặc.
Eimantas

Có, điều này khắc phục sự cố. Tôi chỉ chạy với điền mã của xcode mà không sử dụng chúng. Cảm ơn.
Ross

Tôi đã gặp vấn đề này trước đây, tôi đã tự giải quyết nó bằng cách sử dụng {}, thật tốt khi thấy đó là giải pháp chính xác. +1 cho bạn Dan.
David Wong

20
Bạn không nhất thiết phải sử dụng dấu ngoặc. Đặt một câu lệnh trống ( ;) sau khi casenhãn hoạt động. Lý do của lỗi và lý do tại sao cả hai giải pháp đều hoạt động là một nhãn, bao gồm cả casenhãn, chỉ có thể đứng trước một câu lệnh. Khai báo không phải là các câu lệnh trong C (C99 §6.7, §6.8, §6.8.2) và Objective-C, vì vậy bạn không thể đặt nhãn ngay trước một khai báo. Do đó, các giải pháp: Hoặc đặt một câu lệnh (chẳng hạn như ;hoặc NSLog(@"");) giữa nhãn và khai báo, hoặc bọc khai báo bên trong một câu lệnh ghép (dấu ngoặc vuông) theo sau nhãn.
Peter Hosey

Cảm ơn, câu trả lời này giúp đỡ
inix


3
case 0: {
    Loading my nib file;
    break; 
}
case 1: {
    Loading another nib file;
    break; 
}
Note that if you don't have an assignment (x = y) right after the case it won't be a problem. For example:
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.