C/C++__VA_ARGS__学习--自动打印函数的参数和返回值

C/C++__VA_ARGS__学习--自动打印函数的参数和返回值

  • 一.参考
  • 二.输出
  • 三.代码

通过__VA_ARGS__,自动打印函数的参数和返回值

一.参考

  • c/c++:提取可变参数宏__VA_ARGS__中偶数位置参数

二.输出

input:A StructA= StructA[1,2,3,4,10,11,12,13,]
input:B StructB*= StructB[26,27,28,29,StructA[1,2,3,4,10,11,12,13,]]
input:C int= 1000
input:D float= 2000.2
output:ret "StructA"= StructA[101,2,3,4,10,11,12,13,]

三.代码

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/types.h>
#include <iostream>
#include <string>
#include <algorithm>#define IDENTITY(x) x
#define FL_CONCAT(x, y) x##y// 计算 __VA_ARGS__ 参数个数,最大支持64个参数 https://blog.csdn.net/10km/article/details/80769615
#define FL_TYPEVALUES_COUNT(...) FL_INTERNAL_ARG_COUNT_PRIVATE(0, ##__VA_ARGS__,\64, 63, 62, 61, 60, \59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \9,  8,  7,  6,  5,  4,  3,  2,  1,  0)#define FL_INTERNAL_ARG_COUNT_PRIVATE(\_0,  _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, \_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \_60, _61, _62, _63, _64, N, ...) N#define FL_TYPEVALUES0()
#define FL_TYPEVALUES2(t, v) t v
#define FL_TYPEVALUES4(t, v, ...)        FL_TYPEVALUES2(t, v), IDENTITY(FL_TYPEVALUES2(__VA_ARGS__))
#define FL_TYPEVALUES6(t, v, ...)        FL_TYPEVALUES2(t, v), IDENTITY(FL_TYPEVALUES4(__VA_ARGS__))
#define FL_TYPEVALUES8(t, v, ...)        FL_TYPEVALUES2(t, v), IDENTITY(FL_TYPEVALUES6(__VA_ARGS__))
#define FL_TYPEVALUES10(t, v, ...)       FL_TYPEVALUES2(t, v), IDENTITY(FL_TYPEVALUES8(__VA_ARGS__))#define FL_VALUES_0()
#define FL_VALUES_2(t, v) v
#define FL_VALUES_4(t, v, ...)           FL_VALUES_2(t, v), FL_VALUES_2(__VA_ARGS__)
#define FL_VALUES_6(t, v, ...)           FL_VALUES_2(t, v), FL_VALUES_4(__VA_ARGS__)
#define FL_VALUES_8(t, v, ...)           FL_VALUES_2(t, v), FL_VALUES_6(__VA_ARGS__)
#define FL_VALUES_10(t, v, ...)          FL_VALUES_2(t, v), FL_VALUES_8(__VA_ARGS__)
#define FL_VALUES_12(t, v, ...)          FL_VALUES_2(t, v), FL_VALUES_10(__VA_ARGS__)  #define FL_TYPEVALUES__(count, ...)      IDENTITY(FL_CONCAT(FL_TYPEVALUES, count)(__VA_ARGS__))
#define FL_TYPEVALUES_(count, ...)       FL_TYPEVALUES__(count, __VA_ARGS__)
#define FL_TYPEVALUES(...)               FL_TYPEVALUES_(FL_TYPEVALUES_COUNT(__VA_ARGS__), __VA_ARGS__)#define FL_VALUES__(count, ...)          FL_VALUES_##count(__VA_ARGS__)
#define FL_VALUES_(count, ...)           FL_VALUES__(count, __VA_ARGS__)
#define FL_VALUES(...)                   FL_VALUES_(FL_TYPEVALUES_COUNT(__VA_ARGS__), __VA_ARGS__)template <typename T>
void PRINT_V(T name) {std::cout << name;
}template <typename T>
void PRINT_V(T* name) {std::cout << *name;
}   #define PRINT_ARGS2(t, v)                           \printf("input:%s %s= ",#v, #t);                   \PRINT_V(v);                                       \printf("\n");                                     \fflush(stdout);#define PRINT_ARGS4(t, v, ...)           PRINT_ARGS2(t, v) PRINT_ARGS2(__VA_ARGS__)
#define PRINT_ARGS6(t, v, ...)           PRINT_ARGS2(t, v) PRINT_ARGS4(__VA_ARGS__)
#define PRINT_ARGS8(t, v, ...)           PRINT_ARGS2(t, v) PRINT_ARGS6(__VA_ARGS__)
#define PRINT_ARGS10(t, v, ...)          PRINT_ARGS2(t, v) PRINT_ARGS8(__VA_ARGS__)
#define PRINT_ARGS12(t, v, ...)          PRINT_ARGS2(t, v) PRINT_ARGS10(__VA_ARGS__)#define PRINT_ARGS__(count, ...)         PRINT_ARGS##count(__VA_ARGS__)
#define PRINT_ARGS_(count, ...)          PRINT_ARGS__(count, __VA_ARGS__)
#define PRINT_ARGS(...)                  PRINT_ARGS_(FL_TYPEVALUES_COUNT(__VA_ARGS__), __VA_ARGS__)#define PRINT_RET(t, v)                  printf("output:%s %s= ",#v, #t); PRINT_V(v); printf("\n"); fflush(stdout);#define SDK_PROXY(t, name, ...)                       \t internal_##name(FL_TYPEVALUES(__VA_ARGS__));      \t name(FL_TYPEVALUES(__VA_ARGS__)) {                \PRINT_ARGS(__VA_ARGS__);                          \t ret = internal_##name(FL_VALUES(__VA_ARGS__));  \PRINT_RET(#t, ret);                               \return ret;                                       \}                                                   \t internal_##name(FL_TYPEVALUES(__VA_ARGS__))struct StructA
{int     A;char    B;float   C;char*   D;int     E[4];friend std::ostream & operator<<(std::ostream &out, StructA &A){out << "StructA["<<A.A <<","<< A.B<<","<<A.C<<","<<A.D<<",";std::for_each(std::begin(A.E),std::end(A.E),[](const int &e) {std::cout << e << ",";});out<<"]";return out;}	
};struct StructB
{int      A[4];StructA  B;friend std::ostream & operator<<(std::ostream &out, StructB &A){out << "StructB[";std::for_each(std::begin(A.A),std::end(A.A),[](const int &e) {std::cout << e << ",";});out<< A.B<<"]";return out;}
};StructA user_api(StructA A,StructB* B);SDK_PROXY(StructA, user_api,StructA,A,StructB*,B,int,C,float,D)
{StructA ret=A;ret.A+=100;	return ret;
}int main(int argc,char*argv[])
{StructA A;StructB B;A.A=1;A.B='2';A.C=3.0;A.D="4";int array0[]={10,11,12,13};std::copy(std::begin(array0), std::end(array0), std::begin(A.E));B.B=A;int array1[]={26,27,28,29};std::copy(std::begin(array1), std::end(array1), std::begin(B.A));StructA ret=user_api(A,&B,1000,2000.2);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS Xcode证书配置和ipa打包流程(附详细图文教程)

IOS Xcode证书配置和ipa打包流程&#xff08;附图文教程&#xff09; 前言ipa文件简介证书文件简介Provisioning Profile描述文件简介当前环境版本Xcode证书配置和ipa打包流程生成Apple Distribution Certificates证书创建描述文件&#xff08;Provisioning Profiles&#xff0…

Goland开发者软件激活使用教程

Goland开发者工具&#xff1a; Goland是由JetBrains公司推出的专门针对Go语言设计的集成开发环境&#xff08;IDE&#xff09;。这款工具具有智能的代码补全、强大的代码导航和重构功能&#xff0c;同时提供了丰富的调试工具&#xff0c;能够满足Golang开发者的各种需求。 Gol…

pwn(一)前置技能

以下是pwn中的题目&#xff08;漏洞&#xff09;类型&#xff1a; 关于pwn的学习&#xff1a; 一.什么是pwn&#xff1f;&#xff08;二进制的漏洞&#xff09; "Pwn"是一个俚语&#xff0c;起源于电子游戏社区&#xff0c;经常在英语中用作网络或电子游戏文化中的…

数字化转型浪潮下,信创如何破浪前行,六招助你稳中求胜

信创改造落地过程中的六个难点及应对经验 技术生态迅猛发展&#xff0c;尚未成熟且多元化&#xff0c;信创技术栈应用经验匮乏&#xff0c;导致改造落地工作面临重重挑战。在此背景下&#xff0c;如何克服技术难题&#xff0c;推动信创改造顺利实施&#xff0c;成为业界亟待解决…

Linux nohup 命令

Linux nohup 命令 应用场景 使用 PyCharm 连接服务器跑模型虽然很方便&#xff0c;但是如果遇到网络不佳、PyCharm出BUG、急需转移阵地等情况就只能中断训练&#xff0c;前面的全白跑了。 因此可以尝试直接在服务器上使用命令跑模型&#xff0c;这个命令好说&#xff0c;笨一…

为什么需要归档和管理合同

归档和管理合同是非常重要的&#xff0c;主要有以下几个原因&#xff1a; 1. 法律合规性&#xff1a;公司需要遵守法律和监管要求&#xff0c;合同是法律文件&#xff0c;涉及公司的权益和责任。归档和管理合同可以确保公司遵守法律法规&#xff0c;合同的内容和执行过程都符合…

水质监测设备预警系统

随着工业化进程的加快和城市化水平的提高&#xff0c;水质安全问题愈发受到社会各界的广泛关注。为了确保水资源的清洁与安全&#xff0c;水质监测设备预警系统成为了不可或缺的利器。在这个背景下&#xff0c;HiWoo Cloud平台凭借其先进的技术和卓越的性能&#xff0c;为水质监…

【Java SE】对象的比较

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容满满干货&#xff0c;将会深入介绍对象与对象之间是如何进行比较的&#xff0c;我们知道基本数据类型是可以直…

[Linux]如何在Ubuntu 22.04系統安裝Node-red?

Node-red是一個建立在Node.js上的視覺化程式設計工具&#xff0c;其常見的應用情境為建置或轉換各項硬體之間的通信協定的物聯網或工聯網場域&#xff0c;其可藉由設置來安裝第三方應用模組來建置多樣的通信協定節點&#xff0c;包含modbus in/out, mqtt in/out, websocket in/…

Mac YOLO V9推理测试

环境&#xff1a; Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 工程及模型下载&#xff1a;​​​​​​​https://github.com/WongKinYiu/yolov9 git clone https://github.com/WongKinYiu/yolov9.git 克隆后安装相关依赖&#xff08;没啥依赖好装…

容器集群管理系统Kubernetes(K8S)

目录 一、前言 1.1什么是云原生&#xff1f; 1.2云要素的四要素&#xff1f; 1.2.1微服务 1.2.2容器化 1.2.3DevOps 1.2.4持续交付 1.3云平台有哪些&#xff1f; 1.4SRE 二、Kubernetes 概述 2.1K8S 是什么 2.2K8S作用 2.3K8S版本 2.4为什么要用 K8S 2.5K8S 的特…

在Ubuntu上安装Anaconda之后,启动失败

为了方便管理Pythonu环境&#xff0c;在Ubuntu的Docker容器中安装了Anaconda&#xff0c;安装完成&#xff0c;启动时出现如下错误&#xff1a; conda activate xxx usage: conda [-h] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: acti…

如何让加快OpenHarmony编译速度?

OpenHarmony 有两种编译方式&#xff0c;一种是通过 hb 工具编译&#xff0c;一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理如下&#xff1a; 因为笔者只用 build.sh 脚本编译&#xff0c;没用过 hb 工具&#xff0c;好像下面的选项也可以用于…

Jenkins--自动化构建和部署SpringBoot项目

一、实现目标 通过在Jenkins中创建流水线任务&#xff0c;编写流水线脚本以实现自动化构建和部署SpringBoot项目。流水线脚本主要实现以下几个步骤&#xff1a; Preparation&#xff1a;从gitee上拉取远程仓库的SpringBoot项目代码。Build&#xff1a;使用Maven对拉取的代码进…

部署JVS服务出现上传文件不可用,问题原因排查。

事情的起因是这样的&#xff0c;部门经理让我部署一下JVS资源共享框架&#xff0c;项目的地址是在这里 项目资源地址 各位小伙伴们做好了&#xff0c;我要开始发车了&#xff0c;全新的“裂开之旅” 简单展示一下如何部署JVS文档 直达链接 撕裂要开始了 本来服务启动的好好…

链式二叉树的基本操作1

1.概念回顾 讲二叉树的基本操作之前&#xff0c;我们回顾一下二叉树的概念 在讲树之前&#xff0c;我们的每讲一种数据结构&#xff0c;无外乎就是在讲它们的增删查改&#xff0c;但是在树这里&#xff0c;就有了不小变化。 2.结点的定义 既然是链式二叉树&#xff0c;那必须…

部署 Sentinel 控制台:实现流量管理和监控

序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台&#xff0c;它可以帮助开发者有效地管理微服务的流量&#xff0c;实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台&#xff0c;实现微服务的流量防护和监控。 一、Sen…

深入理解Linux中TCP/IP协议栈的实现原理与具体过程

一、Linux内核与网络体系结构 在我们了解整个linux系统的网络体系结构之前&#xff0c;我们需要对整个网络体系调用&#xff0c;初始化和交互的位置&#xff0c;同时也是Linux操作系统中最为关键的一部分代码-------内核&#xff0c;有一个初步的认知。 1、Linux内核的结构 …

智能改写文章怎么做,3个方法让你轻松改出高质量文章

在如今的自媒体兴盛时代&#xff0c;内容创作对于自媒体人来说是必不可少的一项工作&#xff0c;然而&#xff0c;如何在保持内容原创性的前提下迅速生成高质量的文章变得尤为重要。智能改写文章的出现&#xff0c;为所有的自媒体人带来了一种全新的思路&#xff0c;它让大家在…

2024付费进群系统,源码及搭建变现视频课程(教程+源码)

前三节讲解搭建支付对接&#xff0c;后两节讲解一些引流变现的方法&#xff0c;还有一种变现就是帮人搭建这样的平台&#xff0c;因为全网都没有一套完整的视频教怎么搭建的&#xff0c;有也只是文字教程&#xff0c;一般新人根本看不懂&#xff0c;我视频实操演示&#xff0c;…