2010-10-04 96 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的早期版本。