不带预处理程序的调用方法/文件的文件名/行号

时间:2018-10-15 10:29:29

标签: c++

我有一个日志记录方法,该方法将显示一些用于日志记录控制台输出的其他信息:

Log.hpp:

template<typename... ARGS>
__attribute__((always_inline)) inline static constexpr void log(const ARGS&... args)
{
    std::cout << __FILE__ << "#" << __LINE__; // << args...
}

和调用文件A.cpp:

log("hello");

当显示控制台消息时,文件名和行号当然是从Log.hpp中获取的。但是目的是要知道从何处调用log方法。

是否可以使用除预处理程序之外的其他定义来获取文件名(A.cpp)和A.cpp的行号?我的编码风格禁止预处理器使用,除了文件包含/包含保护。

1 个答案:

答案 0 :(得分:0)

我建议您如下修改代码:

template<typename... ARGS>
__attribute__((always_inline)) inline static constexpr void log(const char* fileName, int lineNumber,const ARGS&... args)
{
    std::cout << fileName << "#" << lineNumber; // << args...
}

然后:

log(__FILE__, __LINE__, "hello");

编辑1

也尝试一下...

#define log(message) log(__FILE__, __LINE__, (message))