2010-12-30 27 views
5

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?

+7

* Lưu ý: Có lẽ tốt nhất nên tránh nếu có thể ... –

+0

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

Trả lời

8

Để 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

+0

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ự. –

2
void printf(char* format, ...) 
{ 
} 

Tra cứu Variadic Functionsvarargs.h hoặc stdarg.h (tùy thuộc vào trình biên dịch).

+5

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 ' '; tất cả các trình biên dịch hiện đại (có nghĩa là ít hơn 10 tuổi) hỗ trợ '' và mã mới chỉ nên sử dụng. Lưu ý rằng một số trình biên dịch không còn hỗ trợ ''; Tôi nghĩ rằng tôi gặp phải điều này trên HP-UX (do tai nạn). –

1

Xem tiêu đề <stdarg.h> và tài liệu có liên quan.

5

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); 
} 
Các vấn đề liên quan