2010-10-04 134 views

回答

2
so ross$ expand < variadic.c && cc -Wall -Wextra variadic.c 
#include <stdio.h> 
#include <stdarg.h> 

void f(int, ...); 
struct x { int a, b; } y = { 5, 6 }; 

int main(void) { 
    float q = 9.4; 
    f(0, 1.234, &q, "how now", 123, &y); 
    return 0; 
} 

void f(int nothing, ...) { 
    va_list ap; 

    va_start(ap, nothing); 
    double f = va_arg(ap, double); 
    float *f2 = va_arg(ap, float *); 
    char *s = va_arg(ap, char *); 
    int i = va_arg(ap, int); 
    struct x *sx = va_arg(ap, struct x *); 
    va_end(ap); 

    printf("%5.3f %3.1f %s %d %d/%d\n", f, *f2, s, i, sx->a, sx->b); 
} 
so ross$ ./a.out 
1.234 9.4 how now 123 5/6 
3

肯定的是,看的printf的常見用法:

printf("Error %d: %s", errNum, errTxt); 
+0

你可以舉一些例子,除了printf – Shweta 2010-10-04 04:41:44

+0

@Shweta:scanf將是另一個明顯的例子。那些(以及sprintf,fscanf等變體)幾乎是真正廣泛使用的唯一可變參數函數。 – 2010-10-04 04:47:25

0

這裏有一個免費的printf例如(舊版:http://codepad.org/vnjFj7Uh

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

/* return the maximum of n values. if n < 1 returns 0 */ 
/* lying to the compiler is not supported in this version, eg:   ** 
** va_max(4, 8, 8, 8, 8, 8, 8, 8, 8)        ** 
** or                 ** 
** va_max(4, 2, 2)             ** 
/* is a bad way to call the function (and invokes Undefined Behaviour) */ 
int va_max(int n, ...) { 
    int res; 
    va_list arg; 

    if (n < 1) return 0; 

    va_start(arg, n); 
    n--; 
    res = va_arg(arg, int); 
    while (n--) { 
    int cur = va_arg(arg, int); 
    if (cur > res) res = cur; 
    } 
    return res; 
} 

int main(void) { 
    int test6 = va_max(6, 1, 2, 3, 4, 5, 6); 
    int test3 = va_max(3, 56, 34, 12); 
    if (test6 == 6) puts("6"); 
    if (test3 == 56) puts("56"); 
    return 0; 
} 
+0

只是一個技術細節...我在那裏看到一對'printf'調用... ;-) – 2010-10-04 15:08:51

+0

主要功能是一個想法...但現在沒有更多的printfs(除了在鍵盤上) – pmg 2010-10-04 15:50:05

0

我做了一個函數來解壓二進制數據使用可變函數,根據您想要「編碼/解碼」的 需要不同的類型。

你會使用它像:

uint32_t a; 
uint16_t b; 
uint16_t c; 
uint8_t *buf = ....; 

depickle(buf,"sis",&a,&b,&c); 

其中「s」期望一個uint16_t *和解碼來自buf 2個字節到a爲小尾數,「我」說要4個字節的小端解碼成'b'

或者例如解碼4個字節大端爲uint32_t的:

uint32_t a; 
uint8_t buf[] = {0x12,0x34,0x56,0x78}; 
depickle(buf,"I",&a); 

目前仍然是圍繞here的早期版本。