2012-04-27 14 views
5

tôi đang tìm kiếm một số mã về macro, và tôi thấy một mã như thế này, cho «va_start» vĩ mô:Tại sao stdarg.h có macro «__va_size»?

#define __va_argsiz(t) \ 
    (((sizeof(t) + sizeof(int) - 1)/sizeof(int)) * sizeof(int)) 
#define va_start(ap, pN) \ 
    ((ap) = ((va_list) (&pN) + __va_argsiz(pN))) 

Tôi muốn biết mục tiêu của «__va_argsiz» chức năng là những gì chính xác. Có hạn chế liên kết không?

Cảm ơn!

+1

Câu hỏi của bạn không có ý nghĩa nhiều nếu không cung cấp cho chúng tôi chi tiết về nền tảng nơi bạn tìm thấy điều này. –

Trả lời

4

Cả hai sự liên kết, và các quy tắc khuyến mãi kiểu mặc định trong C.

3

Dường như nó được sử dụng để tính toán sự bắt đầu của danh sách đối số biến, dựa trên kích thước của các đối số đầu tiên. Đối số đầu tiên là đối số thông thường được yêu cầu, tức là đối với printf() nó sẽ là con trỏ trỏ đến chuỗi định dạng.

1

Điều này được sử dụng cho variable length arguments. Ví dụ: printf sử dụng danh sách đối số độ dài thay đổi như vậy. __va_argsiz tính toán kích thước của danh sách và va_start xác định điểm bắt đầu.

1

Không "giới hạn", triển khai. __va_argsizlàm tròn lênsizeof(t), cho loại t, theo bội số của sizeof(int). Điều đó là cần thiết bởi vì các đối số uknown đang được truyền trên stack call như là một phần của giao thức gọi hàm varargs được tự động căn chỉnh và phân bổ không gian theo bội số của sizeof(int) (rõ ràng, trên nền tảng của bạn), và phải được lấy lại đúng từ đó.

Xem thêm http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/.

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