我想知道在C中是否可以创建一个带有不同类型参数的可变参数函数。 即
void fillDatabase(char* name, int age){ writeToDatabase(name, age); } int main(){ fillDatabase("Paul", 19); fillDatabase("Herbert"); }
在这里,我试图填写一个名称和年龄的数据库。 但也可以用一个免费精选名字大全填充它,而不是年龄。 所以我想知道我是否可以使用相同的function,或者我是否必须写两个不同的function?
在线我只能找到具有相同类型参数的可变函数的示例。
提前致谢!
在C99中,可变参数函数使用stdarg(3)操作(通常实现为扩展到编译器特定的神奇内容的宏,例如GCC内置函数)。 第一个参数应该有一些固定的已知类型,并且通常确定如何获取其他参数; 在今天的几个ABI中,可变参数传递不使用寄存器,因此效率低于固定的arity函数调用。
在你的情况下, 你最好有几个function 。 对于灵感,sqlite有几个开放的function 。
请注意,POSIX使用最后一个可选参数定义了一些函数,特别是open(2) 。 这可能实现为具有不能提供其最后一个参数的函数。
您可以阅读ABI规范以及特定于您的实现的调用约定 。
顺便说一下,缺少函数重载(比如在C ++中)可以理解为C的一个优点(函数名称 – 这是链接器唯一关心的事情,至少在Linux和Unix上确定它的签名)。 因此C ++实际上需要名称修改 。 阅读有关动态链接和dlopen的信息
检查手册页中的va_list,va_start等。
您使用…序列声明您的函数原型来表示变量args:
void myfunction(FILE *, *fmt, ...);
例如,我们声明了一个va_list类型的结构(假设你包含了stdarg):
struct va_list l;
使用参数BEFORE初始化列表… – 我们将* fmt指针传递给va_start:
va_start(l, fmt);
现在,我们可以调用va_arg来获取一个值……如果我们正在处理一个格式字符串,我们可能会有一个像这样的循环:
while (*fmt) { /* Look for % format specifier... */ if (*fmt == '%') { /* Following character can be c for char, i for int or f for float. */ // Opps - advance to char following opening %... fmt++; if (*fmt == 'c') fprintf(stream, "%c", (char) va_arg(l, int)); else if (*fmt == 'i') fprintf(stream, "%i", (int) va_arg(l, int)); else if (*fmt == 'f') fprintf(stream, "%f", (float) va_arg(l, double)); ... and so on...
您依靠%后面的字符来告诉您相应参数中预期的数据类型。 建议你阅读va_list的手册页。
以上就是c/c++开发分享c中具有不同类型参数的可变函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549175.html