2012-04-09 35 views
7

Làm cách nào để viết (nếu có thể ...) một hàm có số lượng tham số không xác định trong C99 (kiểu trả về là hằng số)?Chức năng với số tham số không xác định trong C

+1

Bạn có nghĩa là một hàm variadic? Giống như 'printf'? Bạn đã tra cứu '' chưa? – Potatoswatter

+0

Tải một cuốn sách về C hoặc tìm kiếm những thứ như thế này trực tuyến. –

+1

có thể trùng lặp của [truyền số biến đối số] (http://stackoverflow.com/questions/3836272/passing-variable-number-of-arguments) – Potatoswatter

Trả lời

16

Có bạn có thể làm điều đó trong C sử dụng những gì được gọi là chức năng variadic. Ví dụ, các hàm chuẩn printf()scanf() làm điều này.

Đặt dấu ba chấm (ba chấm) làm thông số cuối cùng mà bạn muốn có 'số lượng tham số thay đổi.

Để truy cập vào các thông số bao gồm <stdarg.h> tiêu đề:

#include <stdarg.h> 

Và sau đó bạn có một loại đặc biệt va_list mà cung cấp cho bạn danh sách các đối số được thông qua, và bạn có thể sử dụng va_start, va_argva_end macro để lặp thông qua danh sách các đối số.

Ví dụ:

#include <stdarg.h> 

int myfunc(int count, ...) 
{ 
    va_list list; 
    int j = 0; 

    va_start(list, count); 
    for(j=0; j<count; j++) 
    { 
    printf("%d", va_arg(list, int)); 
    } 

    va_end(list); 

    return count; 
} 

Ví dụ gọi:

myfunc(4, -9, 12, 43, 217); 

Một ví dụ đầy đủ có thể được tìm thấy tại Wikipedia.

Tham số count trong ví dụ cho biết hàm được gọi có bao nhiêu đối số được chuyển. Các số printf()scanf() tìm ra điều đó thông qua chuỗi định dạng, nhưng đối số đơn giản count cũng có thể làm điều đó. Đôi khi, mã sử dụng giá trị sentinel, chẳng hạn như số nguyên âm hoặc con trỏ rỗng (xem execl() chẳng hạn).

-1

Định dạng với ví dụ hiện có:

int yourFunc (int abc, ...) { 
    //your code here 
} 
+0

Đó chỉ là mẫu thử nghiệm. –

+0

Đó không còn chỉ là một nguyên mẫu, nhưng nó hầu như không giải thích đầy đủ về cách làm việc với các đối số chiều dài thay đổi. –

Các vấn đề liên quan