2010-06-09 48 views
13
struct some_struct{ 
    int a; 
}; 
some_struct n = {}; 

n.a sẽ là 0 sau này;Khởi tạo rõ ràng cấu trúc/thành viên lớp

Tôi biết hình thức niềng răng của khởi tạo này được kế thừa từ C và được hỗ trợ để tương thích với các chương trình C, nhưng điều này chỉ biên dịch với C++, không phải với trình biên dịch C. Tôi đang sử dụng Visual C++ 2005.

Trong C kiểu này khởi

struct some_struct n = {0}; 

là đúng và sẽ zero-khởi tạo tất cả các thành viên của một cấu trúc.

Cặp dấu ngoặc đơn trống có phải là tiêu chuẩn khởi tạo không? Lần đầu tiên tôi thấy hình thức khởi tạo này trong hướng dẫn WinAPI từ msdn.

Trả lời

9

Hình thức khởi tạo dấu ngoặc đơn trống là tiêu chuẩn trong C++ (được phép ngữ pháp rõ ràng). Xem C Static Array Initialization - how verbose do I need to be? để biết thêm chi tiết nếu bạn quan tâm.

Tôi giả sử rằng nó đã được thêm vào C++ vì nó có thể không phù hợp với giá trị 0 được sử dụng cho giá trị init mặc định trong mọi tình huống.

8

Nó là tiêu chuẩn trong C++, nó không phải là trong C.

Cú pháp là được giới thiệu với C++, vì một số đối tượng không thể được khởi tạo với 0, và sẽ không có cách chung để thực hiện khởi tạo giá trị của mảng.

0

{0} là C99 rõ ràng.

Một cách khác để khởi tạo trong một C89 và C++ cách phù hợp là thế này "lừa":

struct some_struct { int a; };

static some_struct zstruct;

some_struct n = zstruct;

Điều này sử dụng thực tế là các biến tĩnh được khởi tạo trước với bộ nhớ 0'ed, trái với khai báo trên ngăn xếp hoặc đống.

+0

Khởi tạo bằng '{0}' cũng hợp lệ cho C89. – jamesdlin

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