【发布时间】:2021-12-08 10:13:01
【问题描述】:
我想使用内置编译器检查来验证自定义日志框架的格式字符串,以提前捕获由于格式字符串参数不匹配而导致的奇怪运行时崩溃。
自定义 C++ 日志记录方法的参数与 printf() 系列相同,因此我试图替换所有调用
MyLogger::Error(
与
fprintf(stderr,
虽然不幸的是 (clang) 预处理器在作用域解析运算符 (::) 上阻塞,即仅识别 ULog 子字符串而不是 ULog::Warn(:
#define MyLogger::Error( fprintf(stderr,
非常感谢您对如何完成这项工作的任何建议。
【问题讨论】:
-
预处理器宏中不允许使用冒号。您是否考虑过使用
constexpr函数?它们在编译时执行,您可以在不受预处理器限制的情况下获得语言的全部功能。 -
如果您使用 GCC 或 Clang,那么您可以添加函数属性来检查
printf之类的字符串及其参数 搜索例如gcc attribute printf. -
@Someprogrammerdude 我不知道我以前怎么没听说过。不错。
-
为什么不使用
sed?sed "s/MyLogger::Error(/fprintf(stderr,/" < source.cpp > source_modified.cpp -
注意:一种可移植的方式是使用 C++ 属性语法,在其他平台上应该忽略它:
[[gnu::format (printf, 1, 2)]]on godbolt
标签: c++ c++11 gcc c++17 c-preprocessor