SORU
23 Ocak 2010, CUMARTESİ


C __VA_ARGS__ numaralı bağımsız işleyişi

Kendisi için net cevap bulamadım basit bir soru. Bağımsız değişkenleri bulmak için nasıl değişken variadic macros? Eğer bir çözüm varsa işleyişi boost ile Tamam duyuyorum.

Eğer bir önemi varsa, makro bağımsız değişken sayısı kadar basit sıra, liste, ya da yeniden işleme için bir dizi artırmak için dönüştürmek için çalışıyorum.

CEVAP
23 Ocak 2010, CUMARTESİ


Ben genellikle bu makro parametreler: bir sayı bulmak için kullanın

#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))

Tam örnek:

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

#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))
#define SUM(...)  (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))

void sum(int numargs, ...);

int main(int argc, char *argv[]) {

    SUM(1);
    SUM(1, 2);
    SUM(1, 2, 3);
    SUM(1, 2, 3, 4);

    return 1;
}

void sum(int numargs, ...) {
    int     total = 0;
    va_list ap;

    printf("sum() called with %d params:", numargs);
    va_start(ap, numargs);
    while (numargs--)
        total  = va_arg(ap, int);
    va_end(ap);

    printf(" %d\n", total);

    return;
}

Tamamen geçerli C99 kodu. Tek bir dezavantajı var, ama - SUM() parametreler olmadan makro çağıramazsınız, ama GCC buna bir çözüm here bkz.

GCC durumunda böyle makrolar tanımlamak gerekir:

#define       NUMARGS(...)  (sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1)
#define       SUM(...)  sum(NUMARGS(__VA_ARGS__), ##__VA_ARGS__)

ve hatta boş parametre listesi ile çalışacak

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • John Lynn

    John Lynn

    8 Ocak 2010
  • placeboing

    placeboing

    7 Mart 2006