我有一个函数,它接受可变数量的参数,然后根据其他因素将每个参数传递给一个函数。这适用于大多数类型,无论它们是否是指针
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
}
我知道issues有va_arg
和双重促销,但我不相信这是我问题的根源。我把这个函数称为
func(23.4);
正如您所看到的,论证是一个double
字面值,所以我不相信我应该关注促销问题。
为什么va_arg
为double
s返回的值不正确,但是对于其他任何类型都没有?我是否遇到某种未定义的行为并且使用double
以外的类型获得幸运?
答案 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 *
用作全能。