惰性 __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
将注销失败。问题是 file
和 line
参数返回声明 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
或等效物。
所以我有一个要评估结果的函数,如果结果失败,该函数将记录文件和行号:
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
将注销失败。问题是 file
和 line
参数返回声明 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
或等效物。