写一写最近的收获把,一个新知识,在使用串口控制遥控器时候
#include <stdarg.h>,算是最近对于c语言的新认识,对于这个库
在C语言中,“...”表示函数的可变参数列表(variable arguments)。也称作“省略号参数”,允许我们定义一个函数,该函数可以接受任意数量的参数。
在你提供的函数定义中,省略号参数类型为“const char *fmt”,它是一个指向格式化字符串的指针。这个函数可以接受任意数量的参数,并且使用这个格式化字符串将这些参数格式化为一个字符串。
例如,如果你想打印一个带有两个整数的字符串,你可以这样调用该函数:
usart_printf("The two numbers are: %d and %d", num1, num2);
在这个例子中,格式化字符串为“The two numbers are: %d and %d”,其中的“%d”表示需要插入整数值。num1和num2是两个整数变量,在调用该函数时会被传递进去。该函数会根据格式化字符串将这两个整数格式化为一个字符串,并通过USART发送出去。
通过使用省略号参数,可以使函数更加灵活,可以处理不同数量和类型的参数。但是需要注意的是,在使用可变参数列表时,需要非常小心地处理参数,以避免可能的问题,如内存泄漏、无法正确解析参数等。
在多举几个例子
第一个:
当编写一个接受可变参数列表的函数时,常见的例子是实现一个简单的日志打印函数,类似于printf函数。以下是一个示例:
#include <stdio.h>
#include <stdarg.h>
void log_print(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
int main()
{
int num = 42;
float f = 3.14;
const char *str = "Hello, World!";
log_print("The number is: %d\n", num);
log_print("The float value is: %.2f\n", f);
log_print("The string is: %s\n", str);
return 0;
}
在上面的例子中,我们定义了一个log_print函数,它接受一个格式化字符串(fmt)和可变参数列表(...)。函数内部使用了va_list、va_start、vprintf和va_end这几个宏和函数来处理可变参数。
在main函数中,我们使用log_print函数来打印不同类型的数据:整数、浮点数和字符串。通过传递不同的格式化字符串和参数,log_print函数可以根据格式化字符串将其格式化为相应的输出,并打印到标准输出。
注意,在使用可变参数列表时,我们需要使用va_start宏来初始化参数列表,使用vprintf函数来打印格式化字符串和参数,最后使用va_end宏来结束参数列表的处理
第二个:
除了日志打印函数,可变参数列表还可以用于实现其他类型的函数,以下是一些例子:
实现一个函数,返回其所有参数的和。
#include <stdarg.h>
int sum(int count, ...)
{
va_list args;
va_start(args, count);
int result = 0;
for (int i = 0; i < count; i++) {
int num = va_arg(args, int);
result += num;
}
va_end(args);
return result;
}
int main()
{
int s1 = sum(3, 1, 2, 3); // 返回6
int s2 = sum(5, 10, 20, 30, 40, 50); // 返回150
return 0;
}
在上面的例子中,我们定义了一个sum函数,该函数接受一个整数count和可变参数列表(...)。函数内部使用了va_list、va_start、va_arg和va_end这几个宏和函数来处理可变参数。
在main函数中,我们使用sum函数来计算不同数量的整数之和,sum函数会遍历所有的参数并将它们相加,然后返回总和
第三个:
实现一个函数,计算n个整数的平均值。
#include <stdarg.h>
double average(int n, ...)
{
va_list args;
va_start(args, n);
double total = 0.0;
for (int i = 0; i < n; i++) {
int num = va_arg(args, int);
total += num;
}
va_end(args);
return total / n;
}
int main()
{
double a1 = average(4, 2, 4, 6, 8); // 返回5.0
double a2 = average(3, 10, 20, 30); // 返回20.0
return 0;
}
在上面的例子中,我们定义了一个average函数,该函数接受一个整数n和可变参数列表(...)。函数内部使用了va_list、va_start、va_arg和va_end这几个宏和函数来处理可变参数。
在main函数中,我们使用average函数来计算不同数量的整数的平均值,average函数会遍历所有的参数并将它们相加,然后返回平均值。
这些都是使用可变参数列表实现的一些简单函数,实际上在开发中还有很多其他的应用场景。使用可变参数列表可以使函数更加灵活,可以处理不同数量和类型的参数。但是需要注意,在使用可变参数列表时,需要非常小心地处理参数,以避免可能的问题,如内存泄漏、无法正确解析参数等