2012-08-30 69 views
18

Giả sử tôi có cấu trúc được xác định đầy đủ với thẻ MyStruct và giả sử rằng các giá trị được phép cho các trường của nó là x, y, ..., z. Tại saoTại sao cấu trúc không thể được gán trực tiếp?

struct MyStruct q = {x,y,..,z}; 

phép, nhưng

struct MyStruct q; 
q = {x,y,...,z}; 

không được phép? Tôi thấy điều này rất khó chịu. Trong trường hợp thứ hai, nơi mà trước đây tôi đã tuyên bố q, tôi cần phải gán giá trị cho từng lĩnh vực, từng người một:

q.X = x; q.Y = y; ... q.Z = z; 

nơi X, Y, ..., Z là những lĩnh vực MyStruct. Có lý do nào đằng sau chuyện này không?

+0

rvalue của công việc không phải là bê tông và nó trong thời gian chạy. phân công ban đầu là bê tông tuy nhiên và có sẵn trong nhị phân (hầu hết có thể xảy ra trong phần .BSS nếu đây là một tập tin elf). nếu bạn muốn gán cấu trúc cho nhau, bạn có thể gán q cho một cái gì đó được khởi tạo. như; struct MyStruct w = {x, y, .., z}; q = w – sardok

Trả lời

26

gì bạn đang tìm kiếm là một hợp chất đen. Điều này đã được thêm vào ngôn ngữ trong C99.

trường hợp đầu tiên của bạn:

struct MyStruct q = {x,y,..,z}; 

là một cú pháp cụ thể để khởi tạo. Trường hợp thứ hai của bạn, trong ngữ nghĩa của ngôn ngữ không phải là khởi tạo, nhưng chuyển nhượng. Phía bên tay phải của nhiệm vụ phải là cấu trúc của loại chính xác. Trước khi C99 không có cú pháp trong ngôn ngữ để viết một cấu trúc chữ, đó là những gì bạn đang cố gắng làm. {x, y, .., z} trông giống như một khối có biểu thức bên trong. Nếu một người được truyền cảm hứng để cố gắng nghĩ về nó như một giá trị bằng chữ, mặc dù ngôn ngữ không có, người ta không thể chắc chắn về kiểu của nó. (. Trong bối cảnh đó, bạn có thể làm cho một đoán tốt)

Để cho phép này và giải quyết vấn đề loại, C99 thêm cú pháp, do đó bạn có thể viết:

q = (struct MyStruct){x,y,...,z}; 
+3

+1 để chỉ định rằng đó là C99. Không biết điều này là có thể có lẽ vì chúng ta phải làm việc với các trình biên dịch cũ. – Leo

23

Bạn có thể làm điều này, nhưng bạn cần phải cung cấp các loại cấu trúc trước khi tổng hợp của bạn:

struct MyStruct q; 
q = (struct MyStruct){x,y,...,z}; 
+0

Đây là một [liên kết tới ideone] (http://ideone.com/rB1Fz) với một ví dụ. – dasblinkenlight

+2

Nhưng chỉ trong C99 (xem câu trả lời của Avi Berger) – AAT

+0

@AAT Bạn đúng, đó là một tính năng đã được thêm vào C99. Tuy nhiên, kể từ khi C99 đã được khoảng hơn một thập kỷ, nó đã khá nhiều trở thành đồng nghĩa với C trong nhiều bối cảnh. – dasblinkenlight

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