宏函数 可变参数 C/C++

2023-05-16

#include <stdio.h>
#include <stdarg.h>
// #define __FUNCTION__ NULL

/* 宏可变参数的几种定义和使用方法 */

#define DEBUG

#ifdef DEBUG
// debug 版本定义宏调试

// 方式一   C99 支持 __VA_ARGS__
#define LOG(format, ...) \
    my_printf(format, __VA_ARGS__)

// 方式二 gcc默认支持
#define LOG_A(format, args...) \
    my_printf(format, args)

/* 
方式一 和 方式二  不能缺省可变参数 
方式三 和 方式四  可以缺省
*/

// 方式三
#define LOG_B(format, ...) \
    my_printf("func:%s,time:%u " format, __FUNCTION__, __LINE__, ##__VA_ARGS__)

// 方式四
#define LOG_C(format, args...) \
    my_printf(format, ##args)
#else
// release 版本 定义空宏,不做任何事情

#endif

// C99 支持的可变参数宏
#define LOG_PRINT(...) \
    printf(__VA_ARGS__)

// 对于 __FUNCTION__ 和 __LINE__ 的使用
int var_arg(const char *format, const char *funcName, int line, ...)
{
    char buff[4096] = {0};
    printf("format %s\n funcname %s fun\n line %d\n", format, funcName, line);
    va_list args;
    va_start(args, line);
    vsnprintf(buff, sizeof(buff), format, args);
    va_end(args);
    printf("va_args: %s\n", buff);
}

void my_printf(const char *format, ...)
{
    char buff[4096] = {0};
    va_list args;
    va_start(args, format); 
    vsnprintf(buff, sizeof(buff), format, args);
    va_end(args);
    printf("my_print: %s\n", buff);
}

int main()
{
    // var_arg("1 %s 2 %d", __FUNCTION__, __LINE__, "hello", 5);     // 对于 __FUNCTION__ 和 __LINE__ 的使用

    // LOG("debug log %s","hello");     // 正确
    // LOG("debug log");                // 编译错误  不能缺省可变参数

    // LOG_A("debug log A %s", "hello");
    // LOG_A("debug log A");            // 编译错误  同理

    // LOG_B("debug log B %s", "hello");
    // LOG_B("debug log B");            // 正确     可以缺省可变参数

    // LOG_C("debug log C %s", "hello");
    // LOG_C("debug log C");               // 正确     可以缺省可变参数

    // LOG_PRINT("hello %d", 5); // 可变参数宏 __VA_ARGS__ 的特别使用

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

宏函数 可变参数 C/C++ 的相关文章

随机推荐

  • python xml读写

    1 xml例子 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt annotation gt lt folder gt VOC2007 lt folder gt lt fil
  • caffe2编译问题:avx、avx2

    caffe2编译问题 xff1a 9898 init intrinsics check cc 54 CPU feature avx is present on your machine but the Caffe2 binary is no
  • 【Hello,电赛】2020电赛从备战到回顾(F题)

    瞎扯几句 2020应该让所有人难忘的一年 赋闲大半年 xff0c 开学两行泪 博主也是突然从大二被迫成了大三老油条 大一的时候身边就有同学开始展露科创竞赛方面的头角 xff0c 后来成了学院有名的带佬 咱当时觉得好玩也是羡慕 xff0c 奈
  • #C++#通过libcurl获取当前次HTTP请求的一些相关信息

    libcurl库是一个非常完整和好用的HTTP请求库 xff0c 通过它 xff0c 我们可以方便的书写HTTP请求程序 xff0c 而且不需要关心HTTP协议内部的细节处理 最近在做一个HTTP监测的程序 xff0c 就是通过libcur
  • 运行Maven Web项目出现 org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException错误

    异常问题描述 xff1a 初学Maven xff0c 新建了一个基于Web骨架的Web项目 xff0c jar 包也导好了 xff0c 作用域也设置正确了 xff0c Tomcat也正常运行了 xff0c 可是就是说编译错误 问题原因 由于
  • 解决mingw-w64外网下载太慢问题,离线包安装配置过程讲解

    常规安装程序下载地址 xff1a http www mingw w64 org doku php 但用安装程序直接安装mingw w64 xff0c 由于国际网络链路问题 xff0c 很难安装成功 xff0c 于是做了打包了一个离线包 xf
  • HTTP安全-nonce和timestamp在Http安全协议中的作用

    http www byywee com page M0 S591 591082 html 写道 前段时间给客户网站做新浪微博账号登录功能 xff0c 对 OAuth协议以及相关的一些安全协议做了一些研究 xff0c 顺便就记录一下学习心得吧
  • NVIDIA TensorRT使用记录

    1 准备工作 1 Pipeline train 在Host PC的GPU上训练test deployment 在TX1 TX2上部署使用 2 主机部署步骤 Running JetPack on the Host JetPack L4T 3
  • 用C语言实现串口通讯程序

    1 首先安装虚拟串口vspd软件 xff0c 用于创建虚拟串口进行互联调试 2 打开vspd软件 xff0c 选择COM1和COM4 xff0c 点击Add pair xff0c 把COM1和COM4互联 3 打开虚拟串口助手 xff0c
  • A2M7雷达在虚拟机的SLAM建图

    准备 Ubuntu18 04 雷达A2M7 一 前期准备 安装 建立工作空间并编译 mkdir p turtlebot ws src cd turtlebot ws src git clone https github com ncnynl
  • linux cmake分别指定编译/运行时动态库链接路径

    1 背景 在树莓派上开发执行程序 xff0c 需要用到opencv curl jsoncpp等库函数支持 xff0c apt get安装好后 xff0c 编译执行正常 但是执行程序挪到别的板子上 xff0c 都要apt get安装这些库 x
  • C语言函数库之字符串连接函数(string.h)

    1 字符串连接函数strcat 函数定义 xff1a char strcat char str1 const char str2 函数功能 xff1a 把str2 包括 39 0 39 拷贝到str1的尾部 连接 xff0c 并返回str1
  • foc学习笔记3——电流环

    foc学习笔记3 电流环 电流环的作用 前文不断强调 xff0c 进行磁场定向控制需要控制的是电流而非电压 xff0c 只是因为我们没有办法直接去控制电流才暂时退而求其次地去控制电压 虽然电压控制的效果也还不错 xff0c 但由于电机不是单
  • ESP32之蓝牙配网blufi

    概览 BluFi 是一款基于蓝牙通道的 Wi Fi 网络配置功能 xff0c 适用于 ESP32 它通过安全协议将 Wi Fi 配置和证书传输到 ESP32 xff0c 然后 ESP32 可基于这些信息连接到 AP 或建立 SoftAP B
  • 机器人学习之项目- Project2 :Where Am I?

    1 项目概述 欢迎来到 Where Am I 我在哪里 定位项目 在这个项目中 xff0c 将学习如何利用ROS AMCL包在Gazebo模拟环境的地图中准确地定位移动机器人 在完成本项目的过程中 xff0c 涉及机器人软件工程的几个方面
  • 将不同类对象指针存放QVector中

    需求 xff1a 将一系列操作步骤放在链表中按需调用 我将每个操作步骤用一个类实现 xff0c 将各类继承于一个基类 xff0c 再将指向各子类的基类指针放在QVector Vector xff0c 即可通过C 43 43 的多态实现调用各
  • 体感摄像头 realsense 系列硬件资料

    一 体感摄像头 Intel的体感摄像机是具有深度图像采集能力的摄像机 xff0c 目前已经出到了400系列 与kinect 2 xff0c ZED xff0c leap motion比较 xff0c 属于比较中庸 手势识别方面不如leap
  • C语言进度条的实现

    C语言进度条的实现 buff N xff1a 进度条状态字符串 xff0c N大小决定进度条长度 xff08 自行调整 xff09 xff0c 使用前先将所有字符初始化置零 xff0c 我这里使用的是memset函数 xff1b label
  • numpy下的随机数

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 https blog csdn net m0 38061927 article details 75335069 在使用Python进行数据处理时 xff0c 往往
  • 宏函数 可变参数 C/C++

    span class token macro property span class token directive hash span span class token directive keyword include span spa