__attribute__()与va_list

博主在看源码时遇到__attribute__()和va_list相关内容及可变参数问题并记录。__attribute__()可设置函数、变量和类型属性,如format检查格式化字符串匹配,constructor、destructor控制执行顺序,noreturn解决返回值报错。va_list用于处理可变参数列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值