STM32之-#define EEPROM_INFO(fmt,arg...) printf(“<<-EEPROM-INFO->> “fmt“\n“,##arg)解释

野火代码详细解析#define EEPROM_INFO(fmt,arg…) printf(“<<-EEPROM-INFO->> “fmt”\n”,##arg)

这是一个C语言中的宏定义,它的作用是在输出信息时添加一个前缀"<<-EEPROM-INFO->>“,方便在输出信息中区分不同的信息来源。其中,fmt是一个格式化字符串,arg是可变参数,用于替换格式化字符串中的占位符。这个宏定义中的”##"表示可变参数的省略号,它可以让宏定义在没有可变参数时也能正常编译。

关于fmt格式化字符串

在C语言中,printf函数和scanf函数都使用了格式化字符串来指定输出或输入的格式。格式化字符串由普通字符和转换说明符组成,其中转换说明符以百分号(%)开头。在格式化字符串中,可以使用占位符来指定输出或输入的数据类型,并可以使用一些修饰符来控制输出或输入的格式。例如,"%d"表示输出或输入一个整数,"%f"表示输出或输入一个浮点数,"%s"表示输出或输入一个字符串。在使用printf函数和scanf函数时,需要将要输出或输入的数据作为参数传递给函数,并在格式化字符串中使用占位符来指定数据类型和格式。

在C语言中,可变参数的实现方式是使用stdarg.h头文件中的宏定义和函数来实现的。在使用可变参数时,需要先定义一个va_list类型的变量,然后使用va_start宏定义来初始化这个变量,再使用va_arg宏定义来依次获取可变参数的值,最后使用va_end宏定义来清理可变参数的内存。在定义可变参数函数时,可以使用省略号(…)或者arg来表示可变参数。例如,下面的代码演示了如何使用可变参数来实现一个求和函数:

#include 
#include 

int sum(int count, ...)
{
    va_list args;
    int total = 0;
    int i;

    va_start(args, count);

    for (i = 0; i < count; i++) {
        total += va_arg(args, int);
    }

    va_end(args);

    return total;
}

int main()
{
    printf("%d\n", sum(3, 1, 2, 3));
    printf("%d\n", sum(5, 1, 2, 3, 4, 5));

   return 0;
}
/*
在这个例子中,sum函数的第一个参数count表示可变参数的个数,
后面的省略号表示可变参数。
在函数内部,首先定义了一个va_list类型的变量args,
然后使用va_start宏定义来初始化这个变量,
接着使用va_arg宏定义来依次获取可变参数的值,
并将它们累加到total变量中。
最后,使用va_end宏定义来清理可变参数的内存。
在main函数中,分别调用了sum函数来计算1+2+3和1+2+3+4+5的值,
并使用printf函数来输出结果。

*/

va_arg是一个宏定义,用于获取可变参数的值。它的第一个参数是一个va_list类型的变量,表示可变参数列表,第二个参数是一个类型名,表示要获取的参数的类型。例如,如果要获取一个int类型的参数,就可以使用va_arg(args, int)来获取。

在使用va_arg之前,需要先使用va_start宏定义来初始化va_list类型的变量,表示可变参数列表的起始位置。在使用完可变参数之后,需要使用va_end宏定义来清理va_list类型的变量

参考原文:《野火代码解析》

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机)