0Pricing
C Academy · Pelajaran

Makro stdarg

va_list, va_start, va_arg.

Makro stdarg adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Apa itu fungsi variadik?

Fungsi variadik menerima jumlah argumen yang bervariasi. Anda sudah menggunakannya: printf dapat menerima sejumlah nilai berapa pun.

C memungkinkan Anda menulis fungsi sendiri menggunakan makro <stdarg.h>.

#include <stdio.h>

int main(void) {
    printf("%d %d %d\n", 1, 2, 3);
    printf("%s\n", "any count of args");
    return 0;
}

Elipsis

Anda mendeklarasikan fungsi variadik dengan ... (elipsis) sebagai parameter terakhir.

Setidaknya satu parameter bernama harus mendahuluinya agar fungsi mengetahui tempat dimulainya bagian yang bervariasi.

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

void demo(int count, ...) {
    printf("This function takes %d extra args\n", count);
}

int main(void) {
    demo(3, 10, 20, 30);
    return 0;
}

Menyertakan stdarg.h

Untuk membaca argumen yang bervariasi, Anda memerlukan #include <stdarg.h>.

Header ini mendefinisikan tipe va_list serta makro va_start, va_arg, dan va_end.

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

void show(int n, ...) {
    va_list args;
    va_start(args, n);
    va_end(args);
    printf("set up and cleaned up\n");
}

int main(void) {
    show(2, 5, 6);
    return 0;
}

va_list dan va_start

Deklarasikan variabel va_list untuk melacak posisi saat ini. Kemudian panggil va_start(list, last) dengan memberikan parameter bernama terakhir.

Ini mengarahkan daftar ke argumen variadik pertama.

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

void first(int count, ...) {
    va_list args;
    va_start(args, count);
    int value = va_arg(args, int);
    printf("first variadic arg = %d\n", value);
    va_end(args);
}

int main(void) {
    first(1, 99);
    return 0;
}

va_arg: membaca nilai

va_arg(list, type) mengembalikan argumen berikutnya dan memajukan daftar. Anda harus memberitahukan tipe yang tepat untuk dibaca.

Setiap pemanggilan bergerak maju satu argumen.

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

void three(int n, ...) {
    va_list args;
    va_start(args, n);
    int a = va_arg(args, int);
    int b = va_arg(args, int);
    int c = va_arg(args, int);
    printf("%d %d %d\n", a, b, c);
    va_end(args);
}

int main(void) {
    three(3, 7, 8, 9);
    return 0;
}

va_end: pembersihan

Selalu panggil va_end(list) setelah selesai membaca. Fungsi ini melakukan pembersihan apa pun yang diperlukan oleh platform.

Melupakannya dapat menyebabkan perilaku tidak terdefinisi pada beberapa sistem.

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

int add_two(int dummy, ...) {
    va_list args;
    va_start(args, dummy);
    int sum = va_arg(args, int) + va_arg(args, int);
    va_end(args);
    return sum;
}

int main(void) {
    printf("%d\n", add_two(0, 4, 6));
    return 0;
}

Mengetahui jumlah argumen

Makro tersebut tidak dapat memberi tahu Anda berapa banyak argumen yang diteruskan. Anda harus menyampaikannya sendiri.

Pendekatan yang umum adalah menggunakan parameter jumlah di awal, seperti pada sum(3, a, b, c).

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

int sum(int count, ...) {
    va_list args;
    va_start(args, count);
    int total = 0;
    for (int i = 0; i < count; i++)
        total += va_arg(args, int);
    va_end(args);
    return total;
}

int main(void) {
    printf("%d\n", sum(4, 1, 2, 3, 4));
    return 0;
}

Menggunakan nilai penanda akhir

Cara lain untuk menandai akhir adalah menggunakan penanda akhir: nilai khusus yang menandai penghentian dan harus disertakan oleh pemanggil, seperti -1 atau NULL.

Lakukan perulangan sampai Anda membaca penanda akhir tersebut.

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

int sum_until_neg(int first, ...) {
    va_list args;
    va_start(args, first);
    int total = first, v;
    while ((v = va_arg(args, int)) != -1)
        total += v;
    va_end(args);
    return total;
}

int main(void) {
    printf("%d\n", sum_until_neg(10, 20, 30, -1));
    return 0;
}

Promosi argumen bawaan

Argumen variadik mengalami promosi bawaan: char dan short menjadi int, sedangkan float menjadi double.

Jadi, selalu baca bilangan bulat kecil sebagai int dan bilangan pecahan sebagai double dengan va_arg.

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

void show_double(int n, ...) {
    va_list args;
    va_start(args, n);
    double d = va_arg(args, double);
    printf("%.2f\n", d);
    va_end(args);
}

int main(void) {
    show_double(1, 3.5f);
    return 0;
}

Menyalin va_list

Jika Anda perlu menelusuri argumen dua kali, gunakan va_copy(dest, src) untuk menggandakan daftar sebelum membacanya.

Anda tidak dapat menggunakan kembali va_list setelah va_end tanpa memulainya kembali melalui va_start.

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

void twice(int n, ...) {
    va_list a, b;
    va_start(a, n);
    va_copy(b, a);
    printf("%d %d\n", va_arg(a, int), va_arg(b, int));
    va_end(a);
    va_end(b);
}

int main(void) {
    twice(1, 42);
    return 0;
}

Menghitung rata-rata

Dengan menggabungkan pola jumlah dengan pembacaan bilangan pecahan, kita dapat menghitung rata-rata daftar angka yang diteruskan secara variadik.

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

double average(int count, ...) {
    va_list args;
    va_start(args, count);
    double sum = 0;
    for (int i = 0; i < count; i++)
        sum += va_arg(args, double);
    va_end(args);
    return sum / count;
}

int main(void) {
    printf("%.2f\n", average(3, 2.0, 4.0, 6.0));
    return 0;
}

Pemeriksaan singkat

Uji pemahaman Anda tentang makro stdarg.

Ringkasan

Anda telah mempelajari mekanisme variadik:

  • Deklarasikan dengan ... setelah setidaknya satu parameter bernama.
  • va_start(list, last) memulai, va_arg(list, type) membaca, dan va_end(list) melakukan pembersihan.
  • Makro tidak mengetahui jumlah argumen — gunakan parameter jumlah atau penanda akhir.
  • Perhatikan promosi bawaan: baca bilangan bulat kecil sebagai int, dan bilangan pecahan sebagai double.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Makro stdarg” gratis?

Ya — teks lengkap “Makro stdarg” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Makro stdarg”?

va_list, va_start, va_arg. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Makro stdarg” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Makro stdarg
  2. Menulis Fungsi Mirip printf
  3. Masalah Keamanan Tipe
  4. Contoh Praktis
← Kembali ke C Academy