2012-04-24 32 views
5

Tôi tuyên bố một struct trong IDE (Netbeans) như thế này:Tuyên bố Cấu trúc: Trình khởi tạo hợp lệ trong khai báo?

struct foo { size_t var = 1; }

Và IDE cho biết quy phạm pháp luật của mình. Tôi biên dịch các dự án (một lib tĩnh của nó ..) và trình biên dịch nói rằng nó hợp pháp (không rên rỉ hoặc ném).

Bây giờ kể từ khi tôi chỉ kiểm tra cú pháp vào thời điểm này tôi phải hỏi người có thể biết nếu điều này thực sự sẽ làm việc khi tôi đi đến khai báo một struct của thẻ này trong thủ tục của tôi như thế này:

struct foo myfoo;

Vì vậy, câu hỏi đặt ra là: Liệu đó có phải là một trợ cấp hợp lệ không? (size_t var = 1) hay là trình biên dịch chỉ vuốt ve bản ngã của tôi ở đây? Tôi đã không tìm thấy bất cứ điều gì trên google hoặc trong tài liệu như thế này vì vậy tôi đoán nó không hoạt động theo cách tôi hy vọng nó sẽ.

* chỉnh sửa Vì vậy, tôi và các 'chàng trai tốt ở đây @SO đã tìm ra rằng nó sẽ biên dịch trong một cấu hình gỡ lỗi nhưng không phải là một cấu hình phát hành. Ai nói một đầu tốt hơn một vài nghìn? : D

+1

xem câu hỏi liên quan http://stackoverflow.com/questions/330793/how- to-initialize-a-struct-in-ansi-c – TJD

+0

@TJD Bây giờ cả hai đều nhanh chóng và tuyệt vời! Cảm ơn. Nhưng tôi vẫn không hiểu tại sao GCC và IDE cho phép nó trượt mà không rên rỉ. Chỉ cần đá những lời cảnh báo lên vụ nổ ... Và tôi vẫn có thể nghe thấy tiếng dế kêu. lol. –

+1

Bạn đang sử dụng phiên bản gcc nào? Tôi chỉ thử với 4.4.3 và tôi nhận được một lỗi 'mong đợi': ',', ','; ','} 'hoặc' __attribute__ 'trước' = 'token' –

Trả lời

4

Tôi không nghĩ rằng nó được cho phép. Bạn cần phải xác định giá trị cho biến, không phải là struct:

struct foo { size_t var; }; 

struct foo myfoo = { 1 }; 

Đối với các IDE cho phép nó, khả năng hiển nhiên sẽ là mã thực sự là một chút khác nhau, chẳng hạn như:

struct foo { static const size_t var = 1; } 

... IDE được biên dịch nó như C++ chứ không phải là C.

+0

Bất cứ điều gì đang xảy ra một điều kỳ lạ. Có lẽ đó là câu hỏi tiếp theo của tôi. "Tại sao cờ này không phải là cảnh báo biên dịch?" –

+0

Cảm ơn sự giúp đỡ Chúc mừng! –

+1

@ TristonJ.Taylor Bạn dint cho chúng tôi biết nguyên nhân là gì? Bạn đang sử dụng một IDE C++? –

1

Câu trả lời đơn giản là: Bạn không thể khởi tạo bên trong định nghĩa struct, vì vậy nếu trình biên dịch là cho phép bạn làm điều đó có điều gì đó kỳ lạ xảy ra.

Để khởi tạo, bạn phải khởi tạo cấu trúc đó trong một var (hoặc đối tượng nếu đó là những gì bạn đang làm) và khởi tạo var đó.

Vì vậy, đối với cấu trúc của bạn:

struct foo { 
    size_t var = 1; 
} 


Bạn sẽ initiazlize như:

type function_name(...params...) { 
    struct foo myFooVar; 
    myFooVar.var = 1; 
    .... 
    return <type>; 
} 
+0

Cảm ơn câu trả lời của bạn! "Có điều gì đó kỳ lạ xảy ra .." DeJa Vu .. lol Nói cách khác: tình cảm của tôi chính xác ... –

+0

Bạn có thể xác nhận lỗi không? 'gcc (GCC) 4.7.0 20120407 (prerelease)' –

+0

Tìm thấy nó: gỡ lỗi cấu hình cho một dự án sẽ để cho rằng slide, chế độ phát hành ném lửa của con rồng từ trái đất trung .. hoặc một cái gì đó như thế. –

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