尝试创建一个宏,可以在定义DEBUG时用于打印调试消息,如下面的伪代码:
#define DEBUG 1
#define debug_print(args ...) if (DEBUG) fprintf(stderr, args)
Run Code Online (Sandbox Code Playgroud)
如何用宏实现这一目标?
我想知道是否有可能在宏参数上编写宏foreach.这是想做的事情:
#define PRINT(a) printf(#a": %d", a)
#define PRINT_ALL(...) ? ? ? THE PROBLEM ? ? ?
Run Code Online (Sandbox Code Playgroud)
可能的用法:
int a = 1, b = 3, d = 0;
PRINT_ALL(a,b,d);
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所取得的成就
#define FIRST_ARG(arg,...) arg
#define AFTER_FIRST_ARG(arg,...) , ##__VA_ARGS__
#define PRINT(a) printf(#a": %d", a)
#define PRINT_ALL PRINT(FIRST_ARG(__VA_ARGS__)); PRINT_ALL(AFTER_FIRST_ARG(__VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)
这是一个递归宏,这是非法的.另一个问题是stop condition递归.
现有的宏在我的应用程序中获得可变数量的变量.
我希望,使用此宏,按name=value格式打印这些变量.
这是一个小例子:
#define EXISTING_MACRO(...) < ??? >
int main()
int a = 0;
int b = 1;
int c = 2;
EXISTING_MACRO(a,b,c);
Run Code Online (Sandbox Code Playgroud)
输出应该是:
a=0, b=1, c=2
Run Code Online (Sandbox Code Playgroud)
我已经尝试通过从宏中调用可变参数模板函数来做到这一点,并且我确实成功打印了变量值,但不是变量名称.(#x打印它们的地址,即使它没有,它可能只显示方法变量名称,'f'):
#define SHOW(a) std::cout << #a << "=" << (a)
template<typename TF>
void write_err_output(std::ostream& out, TF const& f) {
out << f << std::endl;
}
template<typename TF, typename ... TR>
void write_err_output(std::ostream& out, TF const& f, TR const& ... rest) {
out << SHOW(f) << " "; …Run Code Online (Sandbox Code Playgroud)