由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.
uhmm用到的变参地方:
用的原因:
1, SQL语言必须用常量
2,SQL语言格式不相同,参数个数不相同
使用A
dyw_mysql(NULL,"DELETE FROM UHMM_UserLogin WHERE UserId='%s'",user_id);
使用B
dyw_mysql(NULL,"INSERTINTO UHMM_UserInfo
(UserId,UserName,UserType,Birth,Sex,Height,Mobile,Tel,Postcode,Address,EmerContact,EmerTel,Pathography)
VALUES
('%s','%s',%d,'%s','%s',%u,'%s','%s','%s','%s','%s','%s','%s')",
user_mark,name,user_type,calendar,sex,height,mobile,local_telepone,post_code,address,emergency_name_contact,emergency_telephpone_contact,path_ography);
A,B使用了同一个函数,但是参数不同,此为变参函数-------定义
C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:
int printf( const char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式:
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);
包含头文件#include "stdarg.h"
dyw_mysql 内部的定义如下
gboolean dyw_mysql ( MYSQL_RES **res, const gchar *a1, ...)
{
gchar strtmp[768];
va_list a2; //申请一个列表数据类型
va_start(a2,a1);//存储
vsprintf(strtmp,a1,a2);//用数组保存参数a1的全部值,(a1控制格式,a2控制值)
va_end(va2);
}