Tôi muốn xác định hàm bằng ngôn ngữ C có thể lấy số lượng đối số không giới hạn của bất kỳ kiểu dữ liệu nào. Ví dụ: printf()
, scanf()
, v.v.Chức năng trong C với các đối số không giới hạn?
Có ý tưởng nào về điều này không?
Tôi muốn xác định hàm bằng ngôn ngữ C có thể lấy số lượng đối số không giới hạn của bất kỳ kiểu dữ liệu nào. Ví dụ: printf()
, scanf()
, v.v.Chức năng trong C với các đối số không giới hạn?
Có ý tưởng nào về điều này không?
Để sử dụng số biến của tham số trong C bạn cần phải bao gồm tiêu đề
#include <stdarg.h>
printf()
trong C là một ví dụ về chức năng mà mất số biến của các đối số.
int printf(const char *fmt, ...)
Thông tin thêm here
Làm cách nào để chúng tôi có thể truy cập các đối số theo thứ tự ngẫu nhiên? Liên kết chỉ cho chúng ta thấy cách truy cập chúng tuần tự. –
void printf(char* format, ...)
{
}
Tra cứu Variadic Functions và varargs.h
hoặc stdarg.h
(tùy thuộc vào trình biên dịch).
Không nên có bất kỳ trình biên dịch nào vẫn được sử dụng mà vẫn yêu cầu '
Xem tiêu đề <stdarg.h>
và tài liệu có liên quan.
Khai báo hàm như tham gia một đối số cuối cùng ...
. Bạn sẽ cần phải sử dụng các macro từ <stdarg.h>
để truy cập các đối số dưới dạng va_list
.
Nếu bạn chỉ muốn một cái gì đó "giống như printf
, nhưng với một chút hành vi thêm", sau đó bạn có thể vượt qua va_list
-vprintf
, vfprintf
, hoặc vsprintf
.
#include <stdarg.h>
#include <stdio.h>
#include <time.h>
#ifdef __GNUC__
__attribute__((format(printf, 1, 2)))
#endif
void PrintErrorMsg(const char* fmt, ...)
{
time_t now;
char buffer[20];
va_list args;
va_start(args, fmt);
time(&now);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", gmtime(&now));
fprintf(stderr, "[%s] ", buffer);
vfprintf(stderr, fmt, args);
fputc('\n', stderr);
va_end(args);
}
* Lưu ý: Có lẽ tốt nhất nên tránh nếu có thể ... –
bạn không thể viết hàm có thể lấy số đối số "không giới hạn". Luôn luôn có một số giới hạn trên. Những gì bạn có thể có nghĩa là, "biến" số lượng đối số. – Nawaz