2009-01-19 34 views
10

Tại sao trình biên dịch cung cấp cho tôi thông báo lỗi sau trên mã được cung cấp: "phần tử initializer không phải là hằng số". Mã C/C++ tương ứng biên dịch hoàn toàn theo gcc.Lỗi mục tiêu-C: phần tử khởi tạo không phải là hằng số

#import <Foundation/Foundation.h> 

const float a = 1; 
const float b = a + a; // <- error here 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // insert code here... 
    NSLog(@"Hello, World!"); 
    [pool drain]; 
    return 0; 
} 
+0

bạn biết rằng Objective-C được biên soạn dưới gcc không? – hhafez

+0

Bạn có thể loại bỏ tất cả các công cụ Objective-C và biên dịch nó thành C và bạn gặp lỗi tương tự. – Chuck

+2

Nhưng bạn cũng có thể loại bỏ tất cả các công cụ Objective-C, lưu vào tập tin main.c và biên dịch với main.c gcc và nó sẽ hoạt động như mong đợi. (ít nhất nó hoạt động cho tôi) –

Trả lời

12

Mã đó sẽ chỉ biên dịch chính xác nếu câu hỏi const float xuất hiện ở đâu đó ngoài phạm vi tệp.

Đó là một phần của tiêu chuẩn, rõ ràng. Điều quan trọng là tất cả các biến khai báo phạm vi tệp được khởi tạo với các biểu thức không đổi, không phải biểu thức liên quan đến các biến không đổi.

Bạn đang khởi tạo phao 'b' với giá trị của một đối tượng khác. Giá trị của bất kỳ đối tượng, ngay cả khi nó là một const đủ điều kiện, không phải là một biểu hiện liên tục trong C.

+0

bạn có thể giải thích tại sao không? Cảm ơn tôi quan tâm – hhafez

+2

@hhafez - Trong trường hợp này 'b' không được khởi tạo với một đối tượng khác, nhưng với một nguyên thủy khác. Tuy nhiên, cả hai đều được khai báo là 'const' và 'b' phụ thuộc vào giá trị của 'a', đó là bất hợp pháp theo tiêu chuẩn. –

+0

Bạn có thể giải thích phần "sẽ chỉ biên dịch chính xác nếu các câu lệnh phao xuất hiện ở đâu đó ngoài phạm vi tệp"? Điều đó nghĩa là gì? – Olie

1

Tôi không có Xcode trên máy tính của tôi ở đây vì vậy tôi không thể thử ví dụ của tôi,

Nhưng bạn có thể thử

#define A (1) 
#define B (A + A) 

const float a = A; 
const float b = B; 
+0

giải pháp thứ hai của bạn sẽ cung cấp cho cùng một lỗi ... bạn không thể chỉ cần đúc một biến để làm cho nó một chữ. –

+0

xóa giải pháp thứ hai của tôi (chỉ để lại đầu tiên) – hhafez

+3

Hãy nhận biết rằng #define biểu thức là "tiền xử lý chỉ thị", có nghĩa là chúng được thay thế trong mã trước khi trình biên dịch được một vết nứt ở đó. Nếu điều này làm việc, đó là bởi vì bạn nhận được "const float a = (1);" và "const float b = ((1) + (1));" tại thời gian biên dịch. Khá vô nghĩa tổng thể. –

4

@dreamlax là đúng, bạn không thể có một tuyên bố const mà khởi tạo tùy thuộc vào khác (const) biến. Nếu bạn cần một để phụ thuộc vào khác, tôi đề nghị tạo một biến mà bạn có thể coi như là một hằng số và khởi tạo nó chỉ một lần. Xem các SO câu hỏi để biết chi tiết:

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