用预处理器替换 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 代码库中的数十个问题和几个潜在的崩溃)