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

devtools/2024/10/18 14:22:04/

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.ppmy.cn/devtools/32050.html

相关文章

2024 会声会影转场区间如何设置 会声会影电影片头怎么做

视频转场是视频剪辑中重要的技巧之一&#xff0c;合理运用转场效果可以提升视频的质量和观赏性。这篇文章就一起来学习一 下会声会影转场区间默认几秒&#xff0c;会声会影转场区间如何设置。 一、会声会影转场区间默认几秒 会声会影转场区间默认1秒。1秒的转场区间可以使场景…

【氮化镓】一种新型的p-GaN/p-AlGaN/AlGaN/GaN异质结场效应晶体管

文章由韩国首尔弘益大学电子与电气工程学院的Dong-Guk Kim等人撰写&#xff0c;题为“P-GaN/p-AlGaN/AlGaN/GaN heterojunction field-effect transistor with a threshold voltage of 6 V”&#xff0c;发表在IEEE Electron Device Letters上。文章提出了一种新型的p-GaN/p-Al…

机器学习进行情感分析(上)

目录 一、 绪论二、 数据处理1. 构建CSV文档2. 构建模型前的思考2.1. 问题2.2. 解决方法 3. 读取数据4. 用正则表达式来进行对特定符号的剔除5. 使用口袋模型进行文本处理和特征提取 三、 数据划分 一、 绪论 近年来&#xff0c;随着互联网和社交媒体的快速发展&#xff0c;人们…

网络安全运维类面试非技术问题

1、你熟悉哪些品牌的安全设备 答&#xff1a;天融信的ngfw防火墙&#xff0c;老牌防火墙厂商&#xff0c;功能比较齐全&#xff0c;像流量检测&#xff0c;web应用防护和僵木蠕等模块都有&#xff0c;界面是红白配色&#xff0c;设计稍微有点老 2、IPS用的是哪个牌子的 答&…

python脚本实现布尔盲注

目录 代码实现 代码解释 过程中遇到的问题 1、号url编码问题 2、二分法查找 3、如何判断这一次循环内的变量值等于上一次的值 第一种思路 第二种思路 相信师傅们在平常渗透测试中&#xff0c;偶尔会遇到布尔盲注的情况&#xff0c;但是手工的话太慢&#xff0c;上sqlma…

安卓adb 命令查看程序日志

gcat日志导出到文件 在Android设备上&#xff0c;你可以使用logcat命令将日志导出到文件中。打开终端或者命令行工具&#xff0c;然后输入以下命令&#xff1a; adb logcat -d > logcat.txt这条命令会将当前设备的logcat日志输出到名为logcat.txt的文件中。-d参数是用来确…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年&#xff0c;每当我遇到那些错综复杂的业务逻辑和系统交互&#xff0c;总有一个模式像一位忠诚的骑士&#xff0c;默默守护着我的代码城堡&#xff0c;那就是——业务代表模式&#xff08;Business Delegate Pattern&#xff09;。它不是最耀眼的明星…

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算&#xff0c;表达式执行的入口和计算逻辑都是统一的&#xff0c;这里已投影为分析表达式执行的流程。 1 投影函数 用例 create table t1(i int primary key, j int, k int); insert into t1 select i, i % 10, i % 100 from generate_series(1,1000000…