va_arg不使用双打

时间:2015-11-10 20:11:12

标签: c variadic-functions

我有一个函数,它接受可变数量的参数,然后根据其他因素将每个参数传递给一个函数。这适用于大多数类型,无论它们是否是指针

func = (fmtfunc_t)dictobj(deflt, tok);
dat = func(va_arg(lst, void *));

其中fmtfunc_t定义为

typedef char * (*fmtfunc_t)(void *);

此方法适用于以下功能

char *examp1(int i) {
    // i points to the correct integer value
}
char *examp2(char *s) {
    // s points to the correct string value
}

但是,当参数为double

时,它不起作用
char *examp3(double d) {
    // d is 0
}

我知道issuesva_arg和双重促销,但我不相信这是我问题的根源。我把这个函数称为

func(23.4);

正如您所看到的,论证是一个double字面值,所以我不相信我应该关注促销问题。

为什么va_argdouble s返回的值不正确,但是对于其他任何类型都没有?我是否遇到某种未定义的行为并且使用double以外的类型获得幸运?

1 个答案:

答案 0 :(得分:0)

@RaymondChen,@ Olaf和@FUZxxl在评论中指出的问题是,通过调用具有与声明不兼容的类型的参数的函数

char *examp(int i);

fmtfunt_t func = examp;
func(va_arg(lst, void *)); //called with an argument of void*, but the parameter is of type int

我造成了未定义的行为。我通过将参数作为适当的类型

来解决这个问题
double arg = va_arg(lst, double);

而不是试图将void *用作全能。