惰性 __FILE__ 和 __LINE__ 人口

Lazy __FILE__ and __LINE__ Population

所以我有一个要评估结果的函数,如果结果失败,该函数将记录文件和行号:

void foo(const bool is_failure, const char* file = __FILE__, const int line = __LINE__) {
    if(is_failure) cout << "Failure returned at " << file << '#' << line << endl;
}

我可以像 foo(func()) 这样调用它,如果 func returns true 那么 foo 将注销失败。问题是 fileline 参数返回声明 foo 的文件和行。除了使用宏之外,还有其他方法可以完成此操作吗?

Is there a way that I can accomplish this ...

是的。

您可以编写一个扩展为函数调用的 function-like 宏,并将 __FILE____LINE__ 作为参数传递。由于宏是在调用站点展开的,所以这是填充这些宏的行:

#define FOO(arg) foo((arg), __FILE__, __LINE__);

... other than using a macro?

我不这么认为。 __FILE____LINE__ 是预处理器宏。预处理总是发生在编译之前。

没有(那些)宏,在标准 C++ 中无法实现等效功能。 non-macro 功能 std::source_location 已在 n4519 中作为技术规范提出。当作为默认参数传递时,它将由调用站点填充。提案示例:

struct s {
    source_location member = source_location::current();
    int other_member;

    s(source_location loc = source_location::current())
        : member(loc)   // values of member will be from call-site
    {}

    s(int blather)      // values of member should be hereabouts
        : other_member(blather)
    {}

    s(double)           // values of member should be hereabouts
    {}
};

适合您的职能:

void foo(const bool is_failure, source_location loc = source_location::current());

直到(并且除非)此功能被纳入标准,您可以依赖宏或特定于实现的功能,例如 GCC 中的 __builtin_LINE__builtin_FILE实施 std::source_location 或等效物。