va_arg 不使用双打
va_arg not working with doubles
我有一个函数,它接受可变数量的参数,然后将每个参数传递给一个函数,具体取决于其他因素。这对大多数类型都适用,无论它们是否是指针
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
返回不正确的值,但对任何其他类型都没有?我是否遇到了某种未定义的行为并且幸运地使用了 double
以外的类型?
正如@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 *
作为包罗万象。
我有一个函数,它接受可变数量的参数,然后将每个参数传递给一个函数,具体取决于其他因素。这对大多数类型都适用,无论它们是否是指针
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
返回不正确的值,但对任何其他类型都没有?我是否遇到了某种未定义的行为并且幸运地使用了 double
以外的类型?
正如@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 *
作为包罗万象。