如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?

How to implement C/C++ variadic logging macro with __FILE__ and __LINE__ info for multiple platforms?

本文关键字:C++ 信息 变参 记录 日志 参数 LINE 实现 何实现 FILE 平台      更新时间:2023-10-16

我想实现一个 C/C++ 可变参数日志记录宏,其中包含__FILE____LINE__信息。

这是我的简单实现:

#include <stdio.h>
#define MYLOG(format, ...) printf("%s:%d " format, __VA_ARGS__)

唯一的问题是,当我的日志记录没有参数时,此宏不会编译,例如:

MYLOG("hello world");

我读过一些维基和博客,有一个针对GCC编译器的解决方案:

#include <stdio.h>
#define MYLOG(format, ...) printf("%s:%d " format, ##__VA_ARGS__)

但是有没有更标准的方法来实现这个宏在GCC/Clang/MSVC编译器上工作?

如果您的编译器支持 C++20,那么有一种标准方法可以使用__VA_OPT__来解决此问题。 如果__VA_OPT__(,)不为空__VA_ARGS__,它将扩展为逗号。因此,当__VA_ARGS__为空时,没有额外的逗号,也没有编译错误。

#define MYLOG(format, ...) printf("%s:%d " format __VA_OPT__(,) __VA_ARGS__)