2011-01-23 44 views
36
typedef struct { 
    int hour; 
    int min; 
    int sec; 
} counter_t; 

Và trong mã, tôi muốn khởi tạo các phiên bản của cấu trúc này mà không khởi tạo rõ ràng từng biến thành viên. Đó là, tôi muốn làm một cái gì đó như:Làm thế nào để gán một cấu trúc C inline?

counter_t counter; 
counter = {10,30,47}; //doesn't work 

cho 10:30:47

hơn

counter.hour = 10; 
counter.min = 30; 
counter.sec = 47; 

Đừng nhớ lại cú pháp cho việc này, và không ngay lập tức tìm cách để làm điều này từ Googling.

Cảm ơn!

+5

Điều đó sẽ hiệu quả. –

+1

Có vẻ như nó hoạt động nếu tôi khai báo trong cùng một dòng như vậy 'counter_t counter = {10,30,47}' nhưng không phải nếu tuyên bố đã được thực hiện trước khi phân công này. – mindthief

+5

@Oli: Tại sao nó hoạt động? Như văn bản đó là một nhiệm vụ, không phải là khởi tạo. – sth

Trả lời

69

khởi:

counter_t c = {10, 30, 47}; 

Bài tập:

c = (counter_t){10, 30, 48}; 

Sau đó được gọi là một "hợp chất đen".

+7

Lưu ý rằng điều này yêu cầu GCC hoặc C99, không phải là trình biên dịch C89 hoặc C++ nghiêm ngặt. –

+9

@ Jeremiah: điểm tốt, tôi không nhận thấy thẻ C++. Đối với C89, nếu mọi người đi xung quanh nói "C" khi họ có nghĩa là "C89", họ đang trên của riêng mình như xa như tôi đang quan tâm ;-) –

+0

Tốt, yeah tôi chỉ figured nó ra quá sử dụng truy cập = (counter_t) {10,30,47} giống như những gì bạn đề xuất. "Hợp chất theo nghĩa đen" eh? Cảm ơn! – mindthief

7

Vì lợi ích của bảo trì tôi thích danh sách cú pháp VỚI biến xác định một cách rõ ràng như sau:

counter_t counter = {.hour = 10, .min = 30, .sec = 47}; 

hoặc trả lại inline ví dụ:

return (struct counter_t){.hour = 10, .min = 30, .sec = 47}; 

tôi có thể tưởng tượng một kịch bản mà một thay đổi thứ tự các biến được khai báo và nếu bạn không xác định rõ ràng các biến của mình, bạn sẽ phải trải qua tất cả mã để sửa thứ tự các biến. Bằng cách này, nó là sạch hơn và dễ đọc hơn tôi nghĩ

Side-note:

Như @AshleyDuncan và @MM đặt, tính năng này đã bị xóa khỏi ISO C++ sau khi C99 https://stackoverflow.com/a/12122261/2770195, nhưng được hỗ trợ trong gnu C++.

Vì vậy, trong khi bạn có thể làm điều này chỉ tốt:

g++ -std=gnu++11 main.cpp -o main 

này sẽ ném ra một lỗi nếu bạn cố gắng ví dụ trên:

# need an example. I was unable to find. Even clang++ supports it. If you know 
# one, please suggest an edit 

Nếu bạn cần phải biên dịch với C++ biên dịch với sự hỗ trợ đối với ISO C++ 11 hoặc mới hơn không nhận ra phần mở rộng gnu này, bạn có thể phải sử dụng một lớp với một hàm tạo đơn giản:

// backup workaround 
// not cool 
class gnuFTW { 
public: 
    int hour; 
    int min; 
    int sec; 
    gnuFTW(int hour, int min, int sec) { 
     this->hour = hour; 
     this->min = min; 
     this->sec = sec; 
    } 
}; 

int main(int argc, const char * argv[]) { 
    gnuFTW counter = gnuFTW(10,30,47); 
    cout << counter.hour << endl; 
    return 0; 
} 
+2

Tôi thích điều này quá nhưng không tốt như vậy nếu bạn muốn cũng biên dịch với một trình biên dịch C++ như là một tính năng chỉ C99 không được hỗ trợ bởi c + +. https://stackoverflow.com/questions/12122234/how-to-initialize-a-struct-using-the-c-style-while-using-the-g-compiler –

+0

Không biết điều đó. Đó là một sự xấu hổ mặc dù, nó là một tính năng hữu ích như vậy. Cách tiếp cận tốt nhất tôi nghĩ trong trường hợp này là giải pháp của Don Doerner: https://stackoverflow.com/a/14206226/2770195. Đơn giản chỉ cần đặt: Sử dụng các lớp học với các biến và một khởi tạo đơn. Có vẻ như không phải là một thực hành tốt, nhưng chính xác những gì cấu trúc làm. Sẽ cập nhật câu trả lời với làm rõ, nhờ nhắc nhở – MuhsinFatih

+0

Tôi bối rối, tôi chỉ biên dịch một ví dụ với tùy chọn -gnu ++ 11: https://1drv.ms/i/s!ArNqKg0GFwIE0HVGDPPHvpEgaGrh. Tui bỏ lỡ điều gì vậy? – MuhsinFatih

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