使用using别名定义函数指针时GCC Format属性失效求助
GCC using别名与__format__属性的兼容问题解答
这是C++ using 别名声明与GCC属性语法的兼容问题,核心原因是两者的语法结构差异:
typedef的语法允许在声明末尾直接附加属性,这是C时代就支持的写法;using别名声明要求右侧必须是一个完整的合法类型,不能在类型定义后追加属性,因此你最初的写法会触发语法错误。
正确的两种写法:
1. 将属性嵌入函数指针类型内部
把__format__属性放在函数指针的*之后,直接修饰指向的函数类型:
using logger_cb = void(* __attribute__ ((__format__ (__printf__, 1, 0))))(const char*, va_list);
2. 先定义带属性的函数类型,再声明指针别名
这种写法更清晰易读,先给函数本身的类型加属性,再定义指针别名:
// 先定义带格式属性的函数类型 using logger_func = void(const char*, va_list) __attribute__ ((__format__ (__printf__, 1, 0))); // 再定义指向该类型的指针别名 using logger_cb = logger_func*;
以上两种写法都能被GCC正确识别,同时保留__format__属性的编译时诊断功能,符合《ISO C++指南》推荐的using别名使用规范。
内容的提问来源于stack exchange,提问作者SupAl
相关产品推荐
相关产品推荐

