2017-01-29 18 views
8

Tôi không thể tưởng tượng điều này chưa trùng lặp, nhưng tôi không thể dễ dàng tìm thấy câu trả lời vì các tình huống phức tạp hơn đặc biệt đối với C++ dường như thống trị cuộc thảo luận .Lấy địa chỉ của tham số tạm thời (hợp chất theo nghĩa đen) trong C

Có hợp pháp để lấy địa chỉ của một tạm thời được xây dựng trong danh sách tham số của một cuộc gọi hàm trong C99?

Ví dụ, một cái gì đó giống như init_list hoặc init_desig_init như sau:

typedef struct { 
    int x; 
    int y; 
} point_t; 

int manhattan(point_t *p) { 
    return p->x + p->y; 
} 

int init_list() { 
    return manhattan(&(point_t){1, 2}); 
} 

int init_desig_init() { 
    return manhattan(&(point_t){.x = 1}); 
} 

Big Three seem to compile it OK, nhưng tôi có thể không thực sự tìm thấy một tài liệu tham khảo giải thích rằng tuổi thọ của tạm thời sẽ được mở rộng tại ít nhất thông qua cuộc gọi hàm.


Khi nó quay ra, dựa trên câu trả lời của MM dưới đây, một phần của vấn đề tìm kiếm của tôi đã vì tôi đang tìm kiếm thông tin về temporaries, trong khi thuật ngữ C chính xác cho đặc biệt này cấu trúc khởi tạo là hợp chất theo nghĩa đen.

Tôi nên gọi nó là "ba nền tảng lớn" thực sự, theo sự tôn trọng đối với MSVC, nhưng thực sự tôi thực sự chỉ có nghĩa là "trình biên dịch hỗ trợ của trình biên dịch C".

+1

Câu trả lời bạn nhận được là tốt, nhưng có một chút Gotcha mà đáng ghi nhớ khi bạn bắt đầu sử dụng các chữ ghép phức tạp hơn: http://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks – Art

+0

@Art - điểm rất tốt. Vì nó đã không đủ cố gắng để nhớ các quy tắc suốt đời khác nhau cho các chữ kép trong C so với thời gian trong C++ ... – BeeOnRope

Trả lời

7

(point_t){1, 2} không phải là "tạm thời". Nó là một hợp chất theo nghĩa đen. (Cùng một chuỗi các thẻ trong C++ có một ý nghĩa khác nhau, hai ngôn ngữ này không nên nhầm lẫn với nhau).

Ký tự hợp chất là một giá trị, do đó, pháp lý là sử dụng toán tử & đơn nhất trên đó. Thời gian lưu trữ được bao phủ bởi C11 6.5.2.5/5:

Nếu hợp chất bên ngoài xuất hiện bên ngoài chức năng, đối tượng có thời gian lưu trữ tĩnh; nếu không, nó có thời gian lưu trữ tự động được kết hợp với khối kèm theo.

Vì vậy, mã này là đúng, và các hợp chất đen giữ hiện cho đến cuối của hàm nó được khai báo trong.

+0

Cảm ơn bạn. Việc tôi sử dụng "tạm thời" cũng phần nào giải thích tại sao tôi lại có một thời gian khó khăn để tìm kiếm chi tiết về điều này. Để tham khảo thêm, đây là [gcc doc on _compound literals_] (https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html). – BeeOnRope

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