用预处理器替换 C++ class/static 方法?
Replace C++ class/static method with preprocessor?
我想使用内置编译器检查来验证自定义日志记录框架的格式字符串,以提前捕获由于格式字符串 <-> 参数不匹配而导致的奇怪运行时崩溃。
自定义 C++ 日志记录方法的参数与 printf()
系列相同,因此我试图替换对
的所有调用
MyLogger::Error(
和
fprintf(stderr,
虽然不幸的是 (clang) 预处理器在范围解析运算符 (::
) 上阻塞,即,而不是 ULog::Warn(
只识别 ULog
子字符串:
#define MyLogger::Error( fprintf(stderr,
非常感谢关于如何使这项工作的任何建议。
如果把MyLogger::Error
修改成
会怎样
MyLogger::Error(args){
if (0) {
fprintf(stderr,args)
}
//actual function
}
通过这种方式您可以获得内置警告,并且不会影响代码的效率。 (如果你想写入 stderr,你显然可以实际使用打印,但我认为如果你想要你已经使用过它)
您尝试过可变参数模板吗?找到 here.
#include <iostream>
namespace MyLogger
{
template <typename... T>
auto Error(const char * _Format, T &&... args)
{
return printf(_Format, std::forward<T>(args)...);
};
}
#define printf(...) MyLogger::Error(__VA_ARGS__)
int main()
{
MyLogger::Error("Non-Macro Print \n");
printf("Macro Print \n");
return 0;
}
详细说明 @Someprogrammerdude 建议的方法我已经扩展了自定义日志记录 class 以使用 clang/gcc 格式 属性启用编译器格式检查。
声明简单地变成了
static void Error(const char *format,...) __attribute__ ((format (printf, 1, 2)));
用preprocessor来temp比原来的想法还要好。通过将对自定义格式化程序的调用替换为对 printf()
的调用来启用检查,因为它一直处于启用状态,可以立即捕获不匹配的参数!
(FWIW - 已经修复了我们 120 多个 LOC 代码库中的数十个问题和几个潜在的崩溃)
我想使用内置编译器检查来验证自定义日志记录框架的格式字符串,以提前捕获由于格式字符串 <-> 参数不匹配而导致的奇怪运行时崩溃。
自定义 C++ 日志记录方法的参数与 printf()
系列相同,因此我试图替换对
MyLogger::Error(
和
fprintf(stderr,
虽然不幸的是 (clang) 预处理器在范围解析运算符 (::
) 上阻塞,即,而不是 ULog::Warn(
只识别 ULog
子字符串:
#define MyLogger::Error( fprintf(stderr,
非常感谢关于如何使这项工作的任何建议。
如果把MyLogger::Error
修改成
MyLogger::Error(args){
if (0) {
fprintf(stderr,args)
}
//actual function
}
通过这种方式您可以获得内置警告,并且不会影响代码的效率。 (如果你想写入 stderr,你显然可以实际使用打印,但我认为如果你想要你已经使用过它)
您尝试过可变参数模板吗?找到 here.
#include <iostream>
namespace MyLogger
{
template <typename... T>
auto Error(const char * _Format, T &&... args)
{
return printf(_Format, std::forward<T>(args)...);
};
}
#define printf(...) MyLogger::Error(__VA_ARGS__)
int main()
{
MyLogger::Error("Non-Macro Print \n");
printf("Macro Print \n");
return 0;
}
详细说明 @Someprogrammerdude 建议的方法我已经扩展了自定义日志记录 class 以使用 clang/gcc 格式 属性启用编译器格式检查。
声明简单地变成了
static void Error(const char *format,...) __attribute__ ((format (printf, 1, 2)));
用preprocessor来temp比原来的想法还要好。通过将对自定义格式化程序的调用替换为对 printf()
的调用来启用检查,因为它一直处于启用状态,可以立即捕获不匹配的参数!
(FWIW - 已经修复了我们 120 多个 LOC 代码库中的数十个问题和几个潜在的崩溃)