首页 > 其他分享 >野火代码详细解析#define EEPROM_INFO(fmt,arg...) printf("<<-EEPROM-INFO->> "fmt"\

野火代码详细解析#define EEPROM_INFO(fmt,arg...) printf("<<-EEPROM-INFO->> "fmt"\

时间:2023-03-23 11:24:09浏览次数:40  
标签:INFO va 定义 int fmt 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 <stdarg.h>
#include <stdio.h>

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类型的变量

标签:INFO,va,定义,int,fmt,arg,参数,可变
From: https://www.cnblogs.com/mokongking/p/17246756.html

相关文章

  • c# winform只能打开一个程序
    if(System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length>1){MessageBo......
  • 【informix】数据导入导出操作
    目录informix数据导入导出操作1.表数据导出2.导入表数据3.表结构导出4.informix新建/删除表结构5.informix存储过程执行方法informix数据导入导出操作1.表数据导出可以......
  • envinfo All In One
    envinfoAllInOneclinotworkbug❌itsstuck$npxenvinfo$node-v#v16.14.2$npm-v#8.5.0$npx-v#8.5.0https://www.npmjs.com/package/......
  • Going Deeper With Directly-Trained Larger Spiking Neural Networks
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!TheThirty-FifthAAAIConferenceonArtificialIntelligence(AAAI-21) Abstract脉冲神经网络(SNN)在时空......
  • Argon creative-tim UI with create-react-native-app
    ReactNativeElements开发环境&生成项目&虚拟机调试&本地生成APK档&虚拟机运行APK档1.0 Argoncreative-timUIhttps://demos.creative-tim.com/argon-pro-rea......
  • java.lang.IllegalArgumentException: lastRow firstRow lastCol firstCol
    出现这个错误,你应该使用的是easypoi导出功能@Excel(name="时间",orderNum="0")privateIntegerdt;因为你没有在实体类上面添加注解......
  • 大恒相机-Winform\WPF 视频流显示
    usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSystem.IO;usingSystem.Runtime.InteropServices;usin......
  • CS/INFO 5304数据预处理
    CS/INFO5304Assignment1:DataPreparationCredit:94pointsGrade:20%offinalgradeSubmission:Filesthatneedtobesubmittedforarelistedattheendofe......
  • Go语言fmt.Printf使用指南
    fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数。fmtfmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容......
  • vue 默认margin:8px
    #问题情景之前新拉取的vue项目,今天在更换背景图片的时候,发现,图片与顶部有缝隙,查看后发现,body属性中有margin:8px的属性,但是我程序代码中,外层并没有相关设置,且该body是在我......