Tôi có một hàm variadic có tham số float. Tại sao nó không hoạt động?Hàm Variadic (va_arg) không hoạt động với float?
va_arg(arg, float)
Tôi có một hàm variadic có tham số float. Tại sao nó không hoạt động?Hàm Variadic (va_arg) không hoạt động với float?
va_arg(arg, float)
Các thông số của các chức năng tương ứng với ...
là thúc đẩy trước khi đi qua với chức năng variadic của bạn. char
và short
được thăng int
, float
được thăng double
vv
6.5.2.2.7 Các ký hiệu lược trong một prototype hàm declarator gây đối số kiểu chuyển đổi để dừng lại sau khi tham số tuyên bố cuối cùng. Đối số mặc định quảng cáo được thực hiện trên các đối số theo sau.
Lý do cho điều này là các phiên bản đầu của C không có các nguyên mẫu chức năng; các kiểu tham số được khai báo tại trang hàm nhưng không được biết tại trang gọi. Nhưng các kiểu khác nhau được biểu diễn khác nhau và biểu diễn đối số đã truyền phải khớp với kỳ vọng của hàm được gọi. Vì vậy, các giá trị char và giá trị ngắn có thể được chuyển tới các hàm có tham số int hoặc các giá trị float có thể được chuyển tới các hàm có tham số kép, trình biên dịch "quảng bá" các loại nhỏ hơn là loại lớn hơn. Hành vi này vẫn được nhìn thấy khi loại tham số không được biết tại trang cuộc gọi - cụ thể là đối với các hàm hoặc hàm được khai báo không có mẫu thử nghiệm (ví dụ: int foo();
).
Tôi có một câu hỏi liên quan đến điều đó, bởi vì tôi chỉ có cùng một vấn đề. Tôi nghe nói rằng 'printf' cũng quảng bá' float' thành 'double', nhưng' printf' thường "làm việc" ok cho tôi. Sự khác biệt giữa hai trường hợp này là gì? – Kusavil
@Kusavil Nếu bạn có câu hỏi tiếp theo, bạn nên đăng câu hỏi mới (bạn có thể tham khảo câu hỏi này trong bài đăng của mình). Mô tả vấn đề của bạn và hiển thị mã có vấn đề. Điều này sẽ mang lại cho bạn nhiều câu trả lời hơn chỉ một câu trả lời, và nó sẽ có tiềm năng cao hơn để giúp ích cho người khác hơn là nhận xét về một câu hỏi cũ. – dasblinkenlight
@ dasblinkenlight okay, tôi đã đăng câu hỏi của riêng mình :) Không chắc chắn nếu đó là câu hỏi hay trong khi cách nhận thức và hiểu biết của tôi ở đây thiếu nhiều cách, nhưng nếu ai đó quan tâm, đây là câu hỏi của tôi: http: // stackoverflow. com/questions/23836118/variadic-function-va-arg-doesnt-work-với-float-while-printf-does-what-the – Kusavil
Như @dasblinkenlight đã đề cập, float được tăng gấp đôi. Nó hoạt động tốt đối với tôi:
#include <stdio.h>
#include <stdarg.h>
void foo(int n, ...)
{
va_list vl;
va_start(vl, n);
int c;
double val;
for(c = 0; c < n; c++) {
val = va_arg(vl, double);
printf("%f\n", val);
}
va_end(vl);
}
int main(void)
{
foo(2, 3.3f, 4.4f);
return 0;
}
Output:
3.300000
4.400000
Bạn có thể gửi đầy đủ các chức năng? – Jack
Bạn may mắn vì bạn đã có thể nhận được câu trả lời có thể đúng, với ít bối cảnh bạn cung cấp. Lưu ý rằng câu trả lời là "sách giáo khoa" ... nghĩa là, nó có sẵn cho bất kỳ ai đọc tài liệu thích hợp (ví dụ: man stdarg). –
Bạn đúng thông tin nằm trong tài liệu hướng dẫn sử dụng. Tôi đã không nhận thấy nó trước đây. –