2010-03-12 6 views

Trả lời

17

Chức năng như vậy được gọi là variadic function. Bạn có thể tuyên bố một trong C sử dụng ..., như vậy:

int f(int, ...); 

Sau đó, bạn có thể sử dụng va_start, va_arg, và va_end để làm việc với các danh sách đối số. Dưới đây là ví dụ:

#include <stdlib.h> 
#include <stdarg.h> 
#include <stdio.h> 

void f(void); 

main(){ 
     f(); 
} 

int maxof(int n_args, ...){ 
     register int i; 
     int max, a; 
     va_list ap; 

     va_start(ap, n_args); 
     max = va_arg(ap, int); 
     for(i = 2; i <= n_args; i++) { 
      if((a = va_arg(ap, int)) > max) 
       max = a; 
     } 

     va_end(ap); 
     return max; 
} 

void f(void) { 
     int i = 5; 
     int j[256]; 
     j[42] = 24; 
     printf("%d\n",maxof(3, i, j[42], 0)); 
} 

Để biết thêm thông tin, vui lòng xem The C Bookstdarg.h.

+2

dụ của bạn là sai lầm và không làm việc vì nó mâu thuẫn với cú pháp C. Có lẽ bạn đã thực hiện một lỗi đánh máy và quên dấu gạch dưới? – psihodelia

+0

Ngoài ra, việc đề cập đến '#include ' sẽ tốt đẹp. –

+0

Đã khắc phục, cảm ơn phản hồi. –

8

Tính năng này được gọi là Số lượng đối số thay đổi trong hàm. Bạn phải bao gồm tệp tiêu đề stdarg.h; sau đó sử dụng va_list loại và va_start, va_argva_end chức năng trong cơ thể của chức năng của bạn:

void print_arguments(int number_of_arguments, ...) 
{ 
    va_list list; 
    va_start(list, number_of_arguments); 
    printf("I am first element of the list: %d \n", va_arg(list, int)); 
    printf("I am second element of the list: %d \n", va_arg(list, int)); 
    printf("I am third element of the list: %d \n", va_arg(list, int)); 
    va_end(list); 
} 

Sau đó gọi chức năng của bạn như thế này:

print_arguments(3,1,2,3); 

mà sẽ in ra sau:

I am first element of the list: 1 
    I am second element of the list: 2 
    I am third element of the list: 3 
+2

Ý của bạn là 'print_arguments (3,1,2,3)'? – bk1e

+0

@ bk1e: cảm ơn, tôi đã thực hiện lỗi đánh máy; đã cập nhật – psihodelia

7

Giống như những người khác đã nói, printf sử dụng va_args để hoạt động. Đó là một bài tập khá thú vị để viết phiên bản printf của riêng bạn, nếu không có gì khác để xác minh rằng printf, không giống như wrascaln của Pascal không phải là trình biên dịch ma thuật. Sau khi bạn làm điều đó, bạn nên tránh xa nó. Đây là một blog article Tôi đã viết chi tiết lý do tại sao (câu trả lời ngắn gọn là bạn có thể tạo ra các lỗi có thể không bị phát hiện trong một thời gian dài).

4

và chỉ để hoàn thành câu chuyện gcc (không chắc chắn về trình biên dịch khác) hỗ trợ

#define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__) 

để cho phép macro variadic