为什么在第一个代码中使用圆括号而第二个不使用括号?带括号和不带括号的可变参数之间的区别
在第一个代码中,我只使用带圆括号的可变参数和第二个带有可变参数的Integer参数,如果我在调用该函数时使用括号,它将不起作用。
#include <bits/stdc++.h>
void func(char* szFormat, ...);
#define M1(a) M2(a)
#define M2(b) func b
int main()
{
M1(("Hello %s %d\n", "world",2015)); // this works
return 0;
}
void func(char* szFormat, ...)
{
char trace_str[1000];
va_list arg_list;
std::string str;
va_start(arg_list, szFormat);
vsprintf(trace_str, szFormat, arg_list);
va_end(arg_list);
str += trace_str;
std::cout << str << std::endl;
}
下面的这段代码使用括号不起作用。
#include <bits/stdc++.h>
void func(int year, char* szFormat, ...);
#define M1(a,...) M2(a, __VA_ARGS__)
#define M2 func
int main()
{
// M1(2015, ("Hello %s", "world")); // this doesn't works
M1(2015, "Hello %s", "world"); // this way works
return 0;
}
void func(int year, char* szFormat, ...)
{
char trace_str[1000];
va_list arg_list;
std::string str;
va_start(arg_list, szFormat);
vsprintf(trace_str, szFormat, arg_list);
va_end(arg_list);
str += trace_str;
std::cout << str << " " << year << std::endl;
}
谢谢大家!
你真的使用可变参数在C++?从来没有见过很长一段时间...... – Klaus