Đây là C99 standard; các loại "tự quảng cáo" là những loại quảng bá cho chính mình khi các quảng cáo đối số mặc định (§6.5.2.2 khoản 6, tham chiếu các chương trình khuyến mãi số nguyên được mô tả trong §6.3.1.1) được áp dụng.
Đọc của tôi về định nghĩa va_arg
(§7.15.1.1) là giới hạn này là được ngụ ý theo tiêu chuẩn. Phần liên quan là tại đoạn 2:
[...] hoặc nếu loại không tương thích với các loại đối số tiếp theo thực tế (như đề bạt theo đến chương trình khuyến mãi đối số mặc định) [... ]
khá rõ ràng về loại đối số tiếp theo thực sự được quảng cáo, nhưng tôi đọc là không nói bất cứ điều gì về loại đang được quảng cáo. (Tôi nghĩ rằng mệnh đề "(như đã được quảng cáo ...)" chỉ là lời nhắc rằng các quảng cáo đối số mặc định được thực hiện trên các đối số sau khi hàm varargs được gọi.)
Mục này trong danh sách các hành vi chưa xác định trong § k.2 hỗ trợ đọc này:
- các vĩ mô va_arg
được gọi khi không có tranh luận tiếp theo thực tế, hoặc với một loại quy định đó không phải là tương thích với các loại bạt của thực tế số tiếp theo, với một số ngoại lệ (7.15.1.1).
(mặc dù có, tôi biết, Phụ lục J "thông tin" thay vì "quy phạm" ...).
Trong trường hợp đó: va_arg(ap, float)
(ví dụ) không thể có giá trị - loại trong trường hợp đó là float
, nhưng kiểu thúc đẩy của cuộc tranh luận tiếp theo thực tế không thể nào được float
(một cuộc tranh luận float
sẽ được thăng double
).
Nguồn
2011-01-13 00:33:52
Có lý do cụ thể nào cho hạn chế này không? Có lẽ một cái gì đó để làm với 'va_arg' implemetation? –
@crypto: Tôi nghi ngờ Zack đúng (xem phản ứng của anh ấy với Jens); không có cách nào rõ ràng để tìm ra quảng cáo đối số mặc định của một kiểu đã cho mà không có sự trợ giúp đặc biệt từ trình biên dịch, vì vậy điều này cho phép thực hiện 'va_arg (ap, type)' hoạt động mà không cần trợ giúp. (ví dụ, giữ một con trỏ byte đến đối số hiện tại trên ngăn xếp trong 'ap'; sau đó' va_arg' có thể là một số macro ghê tởm di chuyển đến đối số tiếp theo bằng cách truyền nó thành 'type *', tăng con trỏ 'type *', và truyền trở lại con trỏ byte.) –