不定参数
不定参数宏函数
#define log(fmt,...) printf("%s-%d"fmt"\n",__FILE__,__LINE__,fmt,##__VA_ARGS__)
使用…代表不定参数,传入的不定参数由__VA_ARGS__进行管理,当进行宏替换时__VA_ARGS__会对fmt进行格式化后与"%s-%d" "\n"绑定形成一个字符串由printf打印
##的作用是当用户传入的不定参数为空时,编译器可以将##之前的,号去除避免语法错误
C风格不定参数
使用…代表不定参数,需要将不定参数交给va_list对象管理
void print(int cnt,...)
{
va_list ap;
va_start(ap,cnt); //表示不定参数在cnt参数之后
for(int i=0;i<cnt;++i)
{
printf("%d",va_arg(ap.int)); //va_arg用于解析不定参数,向后解析int大小的空间
}
va_end(ap); //当参数解析完毕后需要使用此宏指令来释放ap
}
va_arg的弊端在于必须告知编译器要以什么类型进行解析参数包,相比之下vasprintf的优势更大,可以自动根据传入的参数类型进行解包
void print(const char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
char* ret=NULL;
vasprintf(&ret,fmt,ap); //格式化fmt后存储结果与ret中
va_end(ap);
free(ret); //vasprintf会在堆区上申请一块空间交由ret指针管理,在解析完毕后请手动调用free释放空间
C++风格不定参数
C++中的不定参数需要搭配模板使用
template<typename T,typename ...Args>
void foo(T x.Args&& ...agrs);
此处声明了一个foo模板函数,它具有一个名为T的类型参数和一个名为Args的模板参数包
args即一个函数参数包,参数包中的参数可以是0个或多个
sizeof… 运算符:可以用于计算模板参数包或函数参数包的参数数目
template<typename ...Args>
void goo(Args&& ...args)
{
cout<<sizeof...(Args)<<endl<<sizeof...(args)<<endl;
}
解析可变参数包:可变参数函数通常是递归的,第一步调用包中的第一个参数,剩余参数作为一个参数包传给下一层
void myprintf() //当可变参数包中的参数数目为0是调用,不定义此重载会导致编译出错(找不到接受0个参数函数版本)
{
cout << "ending";
}
template<typename T, typename ...Args>
void myprintf(const T& v, Args&& ...args)
{
cout << v << endl;
myprintf(std::forward<Args>(args)...); //提取参数包中的第一个参数,剩余参数作为整体传给下一层
//使用完美转发保证实参信息的一致性,不改变左右值属性,较少构造
}
时间:
time函数可以获取当前的时间戳(1970/1/1开始至现在的秒数)
time_t timestamp=time(nullptr);
localtime函数可以将时间戳转化为具体年月日时分秒信息并存入一个结构体中返回
struct tm* t=localtime(×tamp);
/*struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};*/
strftime函数用于将struct tm对象转化为相应的格式化字符串输出
struct tm* t=localtime(×tamp);
char buffer[64]={0};
strftime(buffer,sizeof(buffer)-1,"%H%M%S",t);
//如果函数调用成功,buffer中存储的就是时分秒信息
文件
stat函数可以获取指定文件的信息,也可用于判断文件的存在性
struct stat s;
int n=stat(path,&s);
//如果文件不存在n=-1,否则返回0并且s中存储了path文件的各项信息
mkdir函数可以在指定路径下创建目录
mkdir(path.0777); //在创建path目录,目录的权限掩码为0777