宏PRINTFormatDis(a, A, b, B, c, C, d, D) a##b##c##d, A, B, C, D 能简化的来

GKatHere 2015-08-10 06:58:15
RT,
#define PRINTFormatDis(a, A, b, B, c, C) a##b##c##d, A, B, C
#define PRINTFormatDis(a, A, b, B, c, C, d, D) a##b##c##d, A, B, C, D
#define PRINTFormatDis(a, A, b, B, c, C, d, D, e, E) a##b##c##d##e, A, B, C, D, E
#define PRINTFormatDis(a, A, b, B, c, C, d, D, e, E, f, F) a##b##c##d##e##f, A, B, C, D, E, F
能将上面简化为1个宏的来
...全文
170 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
GKatHere 2015-08-12
  • 打赏
  • 举报
回复
昨天去了海边, 今天才回。 呃, 其实这个问题来源于在使用KdPrint(...)的时候, 需要输入大量参数, 而每一次都要去检查是否参数与格式一一对应, 太麻烦, 使用_n模式的时候,照样要点参数个数, 所以想将_n模式, 合为一个更适于使用的模式。 1楼正是我需要的, 不过在VC中要更改下。 呵呵, 3.4楼也是种方法, 我更希望不但printf中能用, KdPrint也能用, DbgPrint也能用, TRACE也适用。 找了下资料,下面是刚刚在VC中试验成功的

//	说明1, VC中宏参数显示包含(), 那么()连同里面内容都都作为一个参数, 到完全展开为止
//	说明2, VC中宏参数显示包含(),那么宏中的所有宏(所有后裔宏)的最后一级展开为最后时间一起展开
//		如上, 必要时, 可使用 左右括符 符号, 使()为非显示
#define BRACKET_L (
#define BRACKET_R )

//	宏 PP_NARG(...)	获得 参数个数, 参数最大数量 63
#define PP_RSEQ_N \
	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 PP_ARG_N( \
	_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,N,...) N
#define PP_NARG(...) \
	PP_ARG_N BRACKET_L __VA_ARGS__,PP_RSEQ_N BRACKET_R

//	宏 CONNECT(a, b)	将两个参数串为一个
#define CONNECT1(a, b) a##b
#define CONNECT(a, b) CONNECT1(a, b)

//	宏 EXPAND_NARG(name, __VA_ARGS__)	将 name 与 参数个数 串为一个, 如 EXPAND_NARG(name, 5, 6, 7, 8, 9) 为 name5
#define EXPAND_NARG(name, __VA_ARGS__) \
	CONNECT BRACKET_L name, PP_NARG(__VA_ARGS__) BRACKET_R (__VA_ARGS__)

//	宏 PRINTFormatDis 将类似 ("%d, ", 1, "%d, ", 2, "%d, ", 3 ) 串为 "%d, %d, %d, %d, ", 1, 2, 3, 4
//	注意, 格式必须正确, 不然发生意想不到的事
#define PRINTFormatDis_2(a, A, ...) a, __VA_ARGS__, A
#define PRINTFormatDis_4(a, A, b, B, ...) PRINTFormatDis_2 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_6(a, A, b, B, ...) PRINTFormatDis_4 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_8(a, A, b, B, ...) PRINTFormatDis_6 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_10(a, A, b, B, ...) PRINTFormatDis_8 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_12(a, A, b, B, ...) PRINTFormatDis_10 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_14(a, A, b, B, ...) PRINTFormatDis_12 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_16(a, A, b, B, ...) PRINTFormatDis_14 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_18(a, A, b, B, ...) PRINTFormatDis_16 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R
#define PRINTFormatDis_20(a, A, b, B, ...) PRINTFormatDis_18 BRACKET_L a##b, B, __VA_ARGS__, A BRACKET_R

#define PRINTFormatDis(...) EXPAND_NARG(PRINTFormatDis_, __VA_ARGS__)
//
zilaishuichina 2015-08-11
  • 打赏
  • 举报
回复
首先希望lz能说明自己的原始需求 对于一个问题的解决方案,不要先自己考虑前一半,然后发现后一半卡住了,就希望别人来顺着你的思路考虑后一半 如果lz的原始需求是 想把类似 printf("%d%s%d", A, B,C) ; printf("%d%s%d%f", A, B,C, D) ; printf("%d%s%d%f%s", A, B,C, D, E) ; 写成一个统一的宏,这样可以在唯一的一个地方统一对打印做一些额外的处理 可以参考 #define MYPRINT(...) printf_args(__VA_ARGS__) void printf_args(const char *format, ...) { char *tmp = new char[1024 * 10]; if (NULL != tmp) { va_list arg; va_start(arg, format); vsprintf(tmp, format, arg); va_end(arg); delete[] tmp; } } MYPRINT("%d%s%d", 3, "123", 4); MYPRINT("%d%s%d%f", 3, "123", 4, 1.0f);
赵4老师 2015-08-11
  • 打赏
  • 举报
回复
复杂宏技术比不上代码生成技术。
Saleayas 2015-08-11
  • 打赏
  • 举报
回复
#define MACRO_2(A, a) PRINT(#A, a)
#define MACRO_4(A, a, B, b) PRINT(#A#B, a, b)
#define MACRO_6(A, a, B, b, C, c) PRINT(#A#B#C, a, b, c)
#define MACRO_8(A, a, B, b, C, c, D, d) PRINT(#A#B#C#D, a, b, c, d)

#define MACRO_II(N, ARGS) MACRO_## N ## ARGS

#define MACRO_I(N, ARGS) MACRO_II(N, ARGS)
#define MACRO(...) MACRO_I(_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__))

#define _VARIADIC_SIZE(...) _VARIADIC_SIZE_EXPAND(_VARIADIC_SIZE_I(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0), )
#define _VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, size, ...) size
#define _VARIADIC_SIZE_EXPAND(a, b) a

	int a = 1;
	MACRO(%d, a);
	float b = 2.0f;
	MACRO(%d, a, %f, b);
	char c = '?';
	MACRO(%d, a, %f, b, %c, c);
	char const *d = "i am string";
	MACRO(%d, a, %f, b, %c, c, %s, d);
mujiok2003 2015-08-11
  • 打赏
  • 举报
回复
太复杂了. 试一下variadic template
#include <cstdio>
#include <utility>

void print(FILE* fp){
}

template<typename T,typename... Args>
void print(FILE* fp,T&& t,char const* fmt, Args... args){
	fprintf(fp,fmt, std::forward<T>(t));
	print(fp,std::forward<Args>(args)...);
}

int main() {
	print(stdout, 10, "%d", 2.2, ",%f", 'H', ",%c","hello", ",%s\n");
	return 0;
}

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧