2014-09-06 20 views
9

Tôi chỉ muốn biết nếu tôi có thể làm điều gì đó như thế ...Tôi có thể trả về cấu trúc khởi tạo trên một dòng trong ANSI C không?

typedef struct Result{ 
    int low, high, sum; 
} Result; 

Result test(){ 
    return {.low = 0, .high = 100, .sum = 150}; 
} 

Tôi biết đó là một cách sai lầm, nhưng tôi có thể làm điều đó hay tôi cần phải tạo ra một biến địa phương để nhận được các giá trị và sau đó trả lại?

Trả lời

16

Bạn có thể làm như vậy bằng cách sử dụng một hợp chất đen:

Result test(void) 
{ 
    return (Result) {.low = 0, .high = 100, .sum = 150}; 
} 

(){} là các nhà điều hành literal hợp chất và hợp chất đen là một tính năng được giới thiệu trong c99.

+0

Phương pháp này dẫn đến ram được phân bổ bởi trình biên dịch, giữ cấu trúc 'Kết quả', nơi các trường được sao chép ban đầu, sau đó sao chép lại đối tượng người gọi của cấu trúc 'Kết quả'. Hai bản sao và phân bổ cấu trúc kết quả là RAM thật và bộ xử lý chu kỳ CPU. – user3629249

+1

@ user3629249: Nhưng chúng có thể được tối ưu hóa và cụ thể là ABI. Trên Linux/x86-64 một hai trường 'struct' thường được trả về trong hai thanh ghi. –

-5
struct Result 
{ 
    int low; 
    int high; 
    int sum; 
}; 

then to create an instance of the struct 

struct Result myResult; 

Regarding your question... 

prototype for the test function 

void test(struct Result *myResult); 

invoke the function by: 

test(&myResult); 

the test function: 

void test(struct Result *argResult) 
{ 
    argResult->low = 0; 
    argResult->high = 100; 
    argResult->sum = 150; 
} 
+3

Cấu trúc typedef'ing bị khấu hao ??? Ngoài ra, 'test (struct Result & myResult)' - từ khi nào điều này trở thành một cách để "gọi một hàm" trong ngôn ngữ C? – AnT

+0

Quyền của bạn, tôi sẽ thay đổi dòng để gọi hàm – user3629249

+0

Tôi không thể tìm thấy tham chiếu gốc để typedef của struct bị khấu hao, vì vậy tôi đã xóa tuyên bố đó – user3629249

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