最近在看libevent
源码的过程中,发现用到了很多关于__attriute__
的内容,和一些可变参数中的va_list
问题,在此记录
__attribute__()
__attribute__()
可以用来设置函数属性,变量属性和类型属性等
- +format
__attribute__((format(printf, m, n)))
检查格式化字符串与“…”的匹配情况, m表示格式化字符串的位置(从1开始),n表示参数“…” 的位置(从1开始),两个要进行匹配
__attribute__((format(scanf, m, n)))
- +constructor
__attribute__((constructor))
在main
函数之前执行
- +destructor
__attribute__((destructor))
在main
函数之后执行
- +noreturn
__attribute__(noreturn)
,定义有返回值的函数时,实际上可能不存在返回值,此时编译器会报错,加上该语句之后能够解决这个问题
va_list
在#include <stdarg.h>
中
va_list
,是一个变量,指向可变参数列表变量
va_start()
,是一个函数,申明从那个变量之后的变量为可变参数
va_arg()
,是一个函数,用于依次读取固定变量之后的变量,按顺序读取,需要指定读取的参数的类型
va_end()
,结束读取
void get(char *msg, ...) {
char *str = NULL;
int num = 0;
va_list val;
va_start(val, msg);
str = va_arg(val, char*);
num = va_arg(val, int);
va_end(val);
printf("output:[%s, %s, %d]\n", msg, str, num);
}
// 执行get("I love", "you", 2);
// output:[I love, you , 2]