带括号和不带括号的可变参数之间的区别
Difference between variadic parameters with and without parentheses
为什么在第一个代码中使用括号有效而在第二个代码中无效?
在第一个代码中,我只使用带括号的可变参数,第二个代码有一个带可变参数的 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;
}
谢谢大家!
看到预处理输出就足以理解这一点。
输入文件:
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;
}
c++ -E foo.cpp
的输出:
# 1 "ess.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 155 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "ess.cpp" 2
void func( int year, char* szFormat, ... );
int main()
{
func(2015, ("Hello %s", "world"));
func(2015, "Hello %s", "world");
return 0;
}
相关部分在这里:
M1(2015, ("Hello %s", "world")); // this doesn't works
M1(2015, "Hello %s", "world"); // this way works
func(2015, "Hello %s", "world");
func(2015, "Hello %s", "world");
宏仅由预处理器解释。如果你放置两个括号级别,你会在函数调用中得到一个额外的,它不会给出预期的结果。在这里,编译器只会在内部块中看到逗号运算符,会看到一个无效的评估或 "Hello %s"
后跟 "world"
,它将以 func(2015, "world");
结束。但是 func(2015, ("Hello %d", 12));
会以 func(2015, 10);
结束,语法错误 没有已知的从 'int' 到 'char *' 的第二个参数的转换
在第一个代码中,您 #define M2(b) func b
删除了一个括号级别,因此
M1(("Hello %s %d\n", "world",2015));
被(正确地)预处理为
func ("Hello %s %d\n", "world",2015);
为什么在第一个代码中使用括号有效而在第二个代码中无效?
在第一个代码中,我只使用带括号的可变参数,第二个代码有一个带可变参数的 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;
}
谢谢大家!
看到预处理输出就足以理解这一点。
输入文件:
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;
}
c++ -E foo.cpp
的输出:
# 1 "ess.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 155 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "ess.cpp" 2
void func( int year, char* szFormat, ... );
int main()
{
func(2015, ("Hello %s", "world"));
func(2015, "Hello %s", "world");
return 0;
}
相关部分在这里:
M1(2015, ("Hello %s", "world")); // this doesn't works
M1(2015, "Hello %s", "world"); // this way works
func(2015, "Hello %s", "world");
func(2015, "Hello %s", "world");
宏仅由预处理器解释。如果你放置两个括号级别,你会在函数调用中得到一个额外的,它不会给出预期的结果。在这里,编译器只会在内部块中看到逗号运算符,会看到一个无效的评估或 "Hello %s"
后跟 "world"
,它将以 func(2015, "world");
结束。但是 func(2015, ("Hello %d", 12));
会以 func(2015, 10);
结束,语法错误 没有已知的从 'int' 到 'char *' 的第二个参数的转换
在第一个代码中,您 #define M2(b) func b
删除了一个括号级别,因此
M1(("Hello %s %d\n", "world",2015));
被(正确地)预处理为
func ("Hello %s %d\n", "world",2015);