2009-07-12 41 views
54

Tôi nghĩ rằng tôi sẽ bị mù, bởi vì tôi không thể tìm ra nơi mà các lỗi cú pháp trong mã này:Tôi có thể khai báo các biến bên trong câu lệnh chuyển đổi Objective-C không?

if(cell == nil) { 
    titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero 
     reuseIdentifier:CellIdentifier ] autorelease 
    ]; 

    switch(cellNumber) { 
     case 1: 
      NSString *viewDataKey = @"Name"; 
etc... 

Khi tôi cố gắng biên dịch nó, tôi nhận được một lỗi : lỗi cú pháp trước mã thông báo '*' trên dòng cuối cùng.

Xin lỗi vì câu hỏi cơ bản như vậy, nhưng tôi còn thiếu gì?

+1

Những loại biến là cellNumber? Câu lệnh switch là từ C, vì vậy việc sử dụng các kiểu Objective-C có thể thực hiện nó. –

+1

C chỉ hỗ trợ các đối tượng giống như tích phân cho 'chuyển/trường hợp' và tôi mong đợi một thông báo lỗi khác nếu đó là vấn đề ở đây. – ephemient

+0

Mục tiêu-C có theo C99 (và C++) và cho phép bạn khai báo các biến ở bất kỳ đâu, hoặc bạn chỉ có thể làm như vậy ở đầu khối?Nếu bạn bị ràng buộc khai báo chúng khi bắt đầu một khối, thì bạn có thể sửa lỗi cú pháp của mình bằng cách đặt một ''{'' sau '': ''của'' trường hợp 1: ''và một kết hợp''} ''trước khi kết thúc vụ án. –

Trả lời

66

Tôi không có một trình biên dịch Objective-C thích hợp trên tay, nhưng miễn là các cấu trúc C là giống hệt nhau:

switch { … } mang đến cho bạn một phạm vi khối cấp, chứ không phải một cho mỗi case. Việc khai báo một biến ở bất kỳ đâu ngoài phạm vi bắt đầu của phạm vi là bất hợp pháp và bên trong một số switchđặc biệt là nguy hiểm vì khởi tạo của nó có thể bị nhảy qua.

Một trong các cách sau có giải quyết được sự cố không?

NSString *viewDataKey; 
switch (cellNumber) { 
    case 1: 
     viewDataKey = @"Name"; 
    … 
} 

switch (cellNumber) { 
    case 1: { 
     NSString *viewDataKey = @"Name"; 
     … 
    } 
    … 
} 
+2

wrt/'Khai báo một biến ở bất kỳ nơi nào ngoài phạm vi bắt đầu phạm vi là bất hợp pháp'. Điều này không đúng trong C99. C99 cho phép điều này và xác định ngữ nghĩa của những gì xảy ra khi "kiểm soát nhảy qua một tuyên bố" và giá trị của tuyên bố đó trong các trường hợp như vậy. – johne

+0

Tôi quên không cho biết tùy chọn nào đã giải quyết được vấn đề, oops. Tôi đã sử dụng giải pháp hàng đầu để giải quyết vấn đề - Tôi không nghĩ rằng tôi đã thử nghiệm đề xuất thứ hai, điều này quá tệ, bởi vì các bạn trông giống như bạn đang có một cuộc thảo luận tuyệt vời! – JoBu1324

+0

Thêm chi tiết về lý do tại sao những công việc này trong http://stackoverflow.com/questions/1231198 –

1

Có thể không hợp lệ để khai báo biến trong khối chuyển đổi không?

+0

Khi tôi nhận xét về câu trả lời của Chuck: 'switch (0) {int i; } 'là hợp lệ C89, và Objective-C là một siêu thực sự của C (không giống như C++), vì vậy mọi thứ hợp pháp trong C (các định danh bị đánh cắp modulo) là hợp pháp trong Objective-C. – ephemient

20

Bạn không thể khai báo biến khi bắt đầu tuyên bố trường hợp. Thực hiện một trường hợp thử nghiệm mà chỉ bao gồm đó và bạn sẽ nhận được cùng một lỗi.

Nó không phải làm với các biến được khai báo ở giữa khối - thậm chí áp dụng một tiêu chuẩn cho phép điều đó sẽ không làm cho GCC chấp nhận một tuyên bố ở đầu của một tuyên bố trường hợp. Có vẻ như GCC xem nhãn trường hợp như một phần của dòng và do đó sẽ không cho phép khai báo ở đó.

Cách giải quyết đơn giản chỉ là đặt dấu chấm phẩy vào đầu vụ việc để khai báo không phải lúc đầu.

+1

Sai. 'switch (0) {int i; } 'biên dịch hoàn toàn tốt ngay cả trở lại trong C89. – ephemient

+0

Không sai. Tôi vừa chạy ví dụ của bạn từ bài đăng của Aragorn thông qua GCC và gặp lỗi tương tự. – Chuck

+0

Tôi tuyên bố rằng "không thể khai báo biến trong câu lệnh" là sai. Hãy thử cho GCC ví dụ nhỏ trong bình luận trước của tôi. – ephemient

4

Trong C bạn chỉ có thể khai báo biến khi bắt đầu một khối trước bất kỳ câu lệnh không khai báo nào.

{ 
    /* you can declare variables here */ 

    /* block statements */ 

    /* You can't declare variables here */ 
} 

Trong C++ bạn có thể khai báo biến bất kỳ nơi nào bạn cần.

+0

'chuyển đổi (1) {trường hợp 0: int i = 1; phá vỡ; mặc định:/* wtf là i? * /; } 'Ngay cả khi bạn có thể khai báo các biến ở khắp mọi nơi, bên trong một' chuyển' là * nguy hiểm *. – ephemient

+0

với visual studio 2008 biên soạn một tệp c. là -> lỗi C2143: lỗi cú pháp: thiếu ';' trước khi 'loại' =) – Aragorn

+0

Bỏ qua các bộ khởi tạo trong C++ thậm chí còn nguy hiểm hơn trong C, và MSVC là trình biên dịch C++ cao hơn trình biên dịch C. Tôi không ngạc nhiên rằng nó không thích rác này. – ephemient

0

Làm thế nào để giải quyết cảnh báo:

1.Insert một ; trong dòng đầu tiên của khối trường hợp của bạn

mã 2.Put bên trong niềng răng

1

Bạn có thể tạo một biến trong một câu lệnh switch nhưng bạn sẽ phải tạo nó trong một khối để phạm vi của biến đó được xác định.

Ví dụ:

switch(number){ 

    case 1: 
     { 
      // Create object here 
      // object is defined only for the scope of this block 
     } 
     break; 
    case 2: 
     { 
      // etc. 
     } 
     break; 
    default: 
     break; 

} 
+0

Đây là câu trả lời mới cho câu hỏi rất cũ với câu trả lời được chấp nhận. Câu trả lời của bạn cung cấp những gì mà người khác không làm? – JAL

+0

Điều này có nghĩa là thay thế cho câu lệnh chuyển đổi thứ nhất được trình bày trong câu trả lời được chấp nhận. Tại thời điểm gửi bài tôi đã không nhận thấy khung nội tuyến với tuyên bố trường hợp trong báo cáo chuyển đổi thứ 2 được cung cấp. – egarlock

Các vấn đề liên quan