C++ 具有零个或多个附加参数的可变宏
我有一个宏用于检查某些测试方法的结果:C++ 具有零个或多个附加参数的可变宏,c++,c,macros,c-preprocessor,C++,C,Macros,C Preprocessor,我有一个宏用于检查某些测试方法的结果: #define Eval(func, ...) if (func == -1) { printf(__VA_ARGS__); return -1; } 我想从功能上实现这一点: Eval(Check_1(),"Check1 failed."); // case 1 Eval(Check_2()); // case 2 Eval(Check_3(), "some variable=%i", variableValue); // case 3 在案例1中,
#define Eval(func, ...) if (func == -1) { printf(__VA_ARGS__); return -1; }
我想从功能上实现这一点:
Eval(Check_1(),"Check1 failed."); // case 1
Eval(Check_2()); // case 2
Eval(Check_3(), "some variable=%i", variableValue); // case 3
在案例1中,我想向用户写注释(“Check1失败”),然后返回-1(它的工作)。
在案例2中,我只想从方法返回,而不是为用户打印任何信息。所以我必须检测空注释的情况,而不是调用printf()-这不起作用
如果任何“Check_x”方法失败,我需要通过返回代码-1退出当前方法
有没有办法用宏来实现这一点
这里有一个非常类似的问题:,但我不能根据我的情况修改此代码
编辑:
我使用C99标准件。
在当前版本的代码中,case2编译时出现了错误“应为表达式”(我认为这是因为逗号和空参数)。
此外,我还需要使用案例3来打印附加信息(变量值)。
所以,第二个参数实际上不是简单的字符串
编辑2:
我得到了任务的解决方案。
我是这样用的:
EVAL_UNIVERSAL(CheckInitialParameters());
EVAL_UNIVERSAL(CheckInitialParameters(), "text");
EVAL_UNIVERSAL(CheckInitialParameters(), "%i", 1);
EVAL_UNIVERSAL(CheckInitialParameters(), "%i %i", 1, 2);
EVAL_UNIVERSAL(CheckInitialParameters());
EVAL_UNIVERSAL(CheckInitialParameters(), "text");
EVAL_UNIVERSAL(CheckInitialParameters(), "%i", 1);
EVAL_UNIVERSAL(CheckInitialParameters(), "%i %i", 1, 2);
非常感谢Jens Gustett和rmn()
我是这样用的:
EVAL_UNIVERSAL(CheckInitialParameters());
EVAL_UNIVERSAL(CheckInitialParameters(), "text");
EVAL_UNIVERSAL(CheckInitialParameters(), "%i", 1);
EVAL_UNIVERSAL(CheckInitialParameters(), "%i %i", 1, 2);
EVAL_UNIVERSAL(CheckInitialParameters());
EVAL_UNIVERSAL(CheckInitialParameters(), "text");
EVAL_UNIVERSAL(CheckInitialParameters(), "%i", 1);
EVAL_UNIVERSAL(CheckInitialParameters(), "%i %i", 1, 2);
如果您将第一个(可选)参数限制为文字字符串,则可以将
printf(\uuu-VA\u-ARGS\uuuu)
更改为printf(“\uu-VA\u-ARGS\uuuuu”)
,并让串联完成工作。否则,在c++11中,您可以转发到可变模板函数。当前代码有什么问题?我觉得没问题。什么是编译器?你使用C++11吗?Jarod42,非常有趣的想法!也许我可以编写第一个宏将(“某个变量=%I”,variableValue)转换为字符串,然后将其传递给我的宏Eval。我认为解决办法非常接近。