Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有零个或多个附加参数的可变宏_C++_C_Macros_C Preprocessor - Fatal编程技术网

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。我认为解决办法非常接近。