C语言风格的可变参数函数,典型的就是printf函数,"##__VA_ARGS__"和"__VA_ARGS__"的区别是:
如果可变参数为空,##__VA_ARGS__会将它前面的","给删掉,否则会编译报错
#include <iostream>
#include <cstdio>
#define TAG "Hello"
/**
C语言风格的可变参数,典型的就是printf函数,"##__VA_ARGS__"和"__VA_ARGS__"的区别是:
如果可变参数为空,##__VA_ARGS__会将它前面的","给删掉,否则会编译报错
*/
#define LOG_PRINT(fmt, ...) printf("[%s:%d]:" fmt, __FUNCTION__,__LINE__,##__VA_ARGS__)
using namespace std;
//C++中通过可变参数函数模板来实现
template<typename...T>
void print(string tag, string fmt, T...args)
{
char buf[128]{};
cout<<tag<<endl;
snprintf(buf, sizeof(buf), fmt.c_str(), args...);
cout<<buf<<endl;
}
int main(void)
{
print(TAG, "hdhjs = %d", 666);
LOG_PRINT("hdhjs = %d\n", 888);
LOG_PRINT("hdhjs = 999\n"); //此时没有可变参数部分,如果使用的是__VA_ARGS__,会编译报错
return 0;
}
运行结果: