C/C++

Variadic function in C

Variadic function là kiểu function có thể nhận một số lượng tham số tùy ý yêu cầu của chúng ta.

Chúng ta đã rất quen thuộc với hàm printf và có bao giờ các bạn thắc mắc “tại sao printf có thể nhận một số lượng argument tùy ý ở nhiều kiểu dữ liệu?!”. Câu trả lời là: printf(char *format,…) là một variadic function.

Cú pháp khai báo Variadic Function như sau:

returnType functionName(dataType positionalArg, )

Trong đó:

  • positionalArg – tham số bắt buộc của function, số lượng có thể quy định nhưng ít nhất phải là 1;
  • – tham số không bắt buộc của function, có số lượng tùy ý, nhưng phải đứng sau các tham số bắt buộc.

Để tạo variadic function, chúng ta cần header file stdarg.h, file này cung cấp các function và macro để truy cập vào variable list.

    • Kiểu dữ liệu va_list được sử dụng để khai báo biến mà chúng ta dùng để tham khảo đến từng argument được truyền vào;
    • Macro va_start() khởi tạo biến có kiểu dữ liệu va_list để trỏ đến tham số không bắt buộc đầu tiên. va_start() phải được thực thi trước khi có thể truy cập vào các tham số này;
    • Macro va_arg() truy xuất và trả về giá trị của đối số kế tiếp;
  • Macro va_end() phải được gọi trước khi chương trình kết thúc.

Macros:

va_start(va_list ap, lastPositionalArg) – khởi tạo

dataType value = va_arg(ap, dataType) – truy xuất dữ liệu

va_end(ap) – kết thúc

Trong đó:

  • ap – biến được dùng để tham khảo đến các đối số không bắt buộc;
  • lastPositionalArg – tham số bắt buộc cuối cùng của Variadic Function.
  • dataType – kiểu dữ liệu của đối số sẽ được truy xuất, có thể là char, int, float,… nhưng phải tương ứng với các đối số được truyền vào;
  • value – giá trị của đối số được truy xuất từ va_arg().

Example: function printInts()

#include "stdio.h"
#include "inttypes.h"
#include "stdarg.h"

void printInts(uint8_t n, ...) {
    va_list ap;
    va_start(ap, n);

    puts("Result: ");
    for (uint8_t i = 0; i < n; i++) {
        printf("%d\t", va_arg(ap, int));
    }
    puts("\n");
    va_end(ap);
}

int main( ) {
    printInts(3, 0, 1, 2);
    printInts(5, 4, 5, 6, 7, 8);
    return 0;
}

Giải thích:
Function printInts() có một tham số bắt buộc là n, dấu … dùng để chỉ ra rằng số lượng và kiểu dữ liệu của những argument tiếp theo là không được định trước. Khai báo … chỉ có thể xuất hiện ở cuối argument list.

Execution:
$ gcc test.c -o test

Output:
Result:
0    1    2 

Result:
4    5    6    7    8

Tham khảo:
[1] The C programming language. Brian Kernighan and Dennis Ritchie.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s