Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有比if DebugMode更好的日志记录方法 我正在制作一个C++库,它将从C调用p/i,所以我不能断点/调试C++的东西。所以我决定添加日志记录,这样我就可以查看是否出现了任何错误以及在哪里发生了错误。我添加了define DebugMode 1,以确定是否要记录。 首先,我不是很擅长C++,但我知道足够的东西。因此,我的问题是:_C++_Logging_Debugging - Fatal编程技术网

有没有比if DebugMode更好的日志记录方法 我正在制作一个C++库,它将从C调用p/i,所以我不能断点/调试C++的东西。所以我决定添加日志记录,这样我就可以查看是否出现了任何错误以及在哪里发生了错误。我添加了define DebugMode 1,以确定是否要记录。 首先,我不是很擅长C++,但我知道足够的东西。因此,我的问题是:

有没有比if DebugMode更好的日志记录方法 我正在制作一个C++库,它将从C调用p/i,所以我不能断点/调试C++的东西。所以我决定添加日志记录,这样我就可以查看是否出现了任何错误以及在哪里发生了错误。我添加了define DebugMode 1,以确定是否要记录。 首先,我不是很擅长C++,但我知道足够的东西。因此,我的问题是:,c++,logging,debugging,C++,Logging,Debugging,有没有比在每个日志调用周围包装DebugMode endifs更好的方法?我可以在Log方法中简单地执行此操作,如果日志记录未启用,则返回,但这不意味着所有日志记录字符串都将在程序集中吗 我怎样才能模仿printf使用其。。。使我能够传递LogVariable x之类的内容的运算符是{0},x 是否有一些技巧,例如获取行号或堆栈跟踪信息,我可以在日志中使用 谢谢这不直接回答问题,但是你可以调试C++中的p/c++代码,只在附加对话框中,确认你有本地代码被检查作为选项。我在哪里可以找到这个选项?C

有没有比在每个日志调用周围包装DebugMode endifs更好的方法?我可以在Log方法中简单地执行此操作,如果日志记录未启用,则返回,但这不意味着所有日志记录字符串都将在程序集中吗

我怎样才能模仿printf使用其。。。使我能够传递LogVariable x之类的内容的运算符是{0},x

是否有一些技巧,例如获取行号或堆栈跟踪信息,我可以在日志中使用


谢谢关于日志记录,你问C++还是C日志?Bot只有在调试配置中定义了预处理器常量,您可以使用它。

一个简单的方法是定义一个宏,如果您不在调试模式下,它什么也不做。这样,您就不必将每个调用都封装在ifdef中

一个简单的实现可能是:

#if DebugMode
#define MY_LOG(string, ...) printf(string, __VA_ARGS__)
#else
#define MY_LOG(string, ...)
#endif

还有其他方法和库,比如boost,但这会让您很快得到一些东西

如果条件是编译时常量,那么预处理后的代码会变成:

if (0) 
    do the logging
然后,编译器通常会足够聪明,能够去除死代码,包括传递给它的字符串,当然,除非在其他未去除的代码中也使用了字符串

类似printf的代码非常简单:

#include <stdarg.h>

void log(char const &fmt, ...) { 
    if (do_logging) {
        va_list args;

        va_start(args, fmt);
        vfprintf(output_file, fmt, args);
    }
}
在宏中,重要的是它应该在宏中,而不是被调用的函数中,您可以使用_FILE_uuuuu和_LINE_uuuuu作为当前行号和要放入日志的源文件名。对于上面的代码,您可能希望在格式字符串之前传递它们。

我建议使用,这样您就不必关心调试了!调试。库使用C++模板确保在未启用日志记录时没有支付性能成本。它也是100%类型安全的,并且可以扩展到用户定义的类型

bar_t  bar;

pantheios::log_DEBUG("foo ", bar, " was doing something you should remember");

检查他们的进一步信息。< /P>这不直接回答问题,但是你可以调试C++中的p/c++代码,只在附加对话框中,确认你有本地代码被检查作为选项。我在哪里可以找到这个选项?C++日志记录。在那个字段中我看不到任何C客户端,只有ReqSr32和BrowseDo的能力,你知道C++可执行文件的名称,它调用C++的DLL。在命令字段中填写此可执行名称。如果你不知道客户的名字,你怎么运行它?哦,我明白了,我不确定我应该放什么。谢谢这将包含程序集中的所有调试字符串吗?如果禁用调试,字符串是否不会被编译到程序集中?这与您的解决方案相同吗?因为我喜欢它的外观。如果DebugMode设置为0,则预处理器将剥离字符串。你刚才说我的日志某物的值是%d,某物;你准备好了。字符串将只在调试程序集中。这正是我想要的!非常有用,谢谢!啊,好的,我将把这些作为参数传递给logging Method抱歉,但是当日志记录未启用时,同一页面清楚地显示了性能成本。为什么抱歉?该页面显示启用和未启用日志记录时的相对成本。在这两种情况下,Pantheios都具有优异的性能。请记住,成本规模是对数的。