- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在用 C++ 实现一个日志处理程序,它工作得很好,但是我发现有一件事是可用的,那就是记录器从中获取输出的地方。
我想这并不是什么大问题,但我偶然发现了 __func__
标识符,它基本上会保留当前函数的函数名称。
所以我在我的 Log 类中有一个名为 Write
的静态函数,它需要一个日志级别和一个变化列表。所以我会这样调用它:
Log::Write(LOG_DEBUG, "this is an integer: %d", 10);
它会打印:
2013-01-02 => 10:12:01.366 [DEBUG]: this is an integer: 10
但是我认为在消息中也包含调用者可能会很有用,以生成如下内容:
2013... => 10:12:... (functionName) [DEBUG]: blah
所以我能做的(当然)是将 __func__
作为参数添加到 Log::Write
,但是这意味着任何时候我调用 Log::Write
我还需要发送 __func__
,它总是相同的,我觉得应该可以在没有明确说明的情况下做到这一点。
所以我想要的是将提供的功能:
Log::Write(LOG_DEBUG, __func__, "message");
无需每次都显式输入 func。
我不知道这是否真的可行,我得到的最好的选择是有一些方法可以在函数 Write
中取消引用调用者,这似乎不太可能我可以“推断”这样的参数。但至少值得一问,也许我可以看看有哪些选择。
谢谢。
最佳答案
这通常使用宏以及文件名 __FILE__
来完成和行号 __LINE__
.
void Log::Write(Level l,
char const* function,
char const* file,
int line,
char const* format,
...);
被包裹成一个宏:
#define LOG(Level_, Format_, ...) \
Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__);
请注意,您可能希望通过检查是否在该级别登录来“节省”一些计算:
// suppose availability of "bool Log::Enabled(Level l)"
#define LOG(Level_, Format_, ...) \
while (Log::Enabled(Level_)) { \
Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__); \
break; \
}
使用while
而不是 if
是为了避免悬空的 else 问题。
注意:您可能希望研究使用流进行日志记录。 printf
的问题风格是它不可组合。使用流,您可以重载 std::ostream& operator<<(std::ostream&, X const&)
对于任何 X
然后只编写一次方法将其内容转储到日志中。
关于c++ - __func__ 和日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14119469/
名为 __func__ 的宏的存在是 C99 的一部分,其意图很明确,但它在给定函数中扩展为标准化的确切文本吗? 最佳答案 是的。宏被定义为扩展为函数的名称。 C11,§6.4.2.2 The ide
我正在尝试创建一个宏,该宏将根据调用宏的函数名称修改数据结构中的字段,请参见下文: #define REGISTER(func_name) data.func_name##_n++ struct da
#include char* __func__ = "hello"; void myfunc(void) { printf("%s\n", __func__); } int mai
我正在用 C++ 实现一个日志处理程序,它工作得很好,但是我发现有一件事是可用的,那就是记录器从中获取输出的地方。 我想这并不是什么大问题,但我偶然发现了 __func__ 标识符,它基本上会保留当前
我正在阅读 C/C++ 中的 __FUNCTION__/__func__(它们用于打印使用它们的函数的名称)。我读到的每个地方都说这些是宏,在预处理时被替换。因此,我使用命令 gcc -E prog.
#include void someFunc(void) { printf("%s\n"), __func__); } 每次调用该函数时都会打印: someFunc Java 的等价物是什么?
我在评论中看到使用 __func__ 存在安全风险。我需要了解这是怎么回事? 最佳答案 使用 __func__ 揭示二进制文件中的函数名称,从而减轻有权访问二进制文件的攻击者的工作。 关于c - __
如果我们在 C (C99/C11) 和 C++ 中的函数之外使用预定义变量 __func__ 会发生什么? #include const char* str = __func__; int main
我正在尝试通过将字符串存储在特殊部分 (__dlog) 来向 ELF 可执行文件添加元数据。当前的方法使用(滥用?)内联汇编来存储字符串并且几乎可以按预期工作。 #include #include
在实例方法的文档中指出: Methods also support accessing (but not setting) the arbitrary function attributes on t
大多数编译器都支持一些特殊的宏,例如 __FUNC__ 或 __PRETTY_FUNCTION__ 但我想知道如何在编译时验证它们是否可用,有这个来自 boost/current_function.h
谁能解释一下 Python datamodel reference 中关于用户定义函数 的以下部分是什么?是关于? When a user-defined method object is creat
在我正在处理的项目中给出以下代码: /* Pre-definitions in a pre-definitions file to be included in the project */ #ifd
我正在使用 gcc 编译 C99 代码。我想编写一个宏,它将返回一个包含函数名称和行号的字符串。 这是我的: #define INFO_MSG __FILE__ ":"__func__"()" 但是
我正在尝试构建一个调试日志消息函数,用于记录调用日志消息的文件、行和函数。 #define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s)
我是python新手,对python 2.7中的__func__不太了解。 我知道当我这样定义一个类时: class Foo: def f(self, arg): print
对于 gcc 项目,__FUNCTION__、__FILE__ 和 __func__ 返回的指针是否保证指向持久内存? (也就是说,我可以安全地引用另一个函数范围内的指针吗?)我知道 __func__
我想写一个 C 宏来接受这个: int foo() { MY_MACRO } 并将其扩展为: int foo() { _macro_var_foo++; } 我发现我不能使用 __func__
“C”标准是否支持类似于 __func__ 的函数参数名称? 最佳答案 不,C99 标准有以下内容: 6.10.8 Predefined macro names The following macro
我想定义一个宏来连接__func__(或__FUNCTION__)和__LINE__: 以下工作正常: // macro_test.cc #include #define STR2(X) #X #d
我是一名优秀的程序员,十分优秀!