How to add simple debug to Application using preprocessor defines
我正在WinXP上开发GUI应用程序,但不幸的是std :: cerr / cout无处可去。我想添加一个简单的调试方法,将消息追加到日志文件。
我一直在散列一个几乎可行的解决方案,阅读其他文章。并能够在我的GUI应用程序中调用一个debug()方法。但是,在我试图用来找到解决方案的以下示例应用程序中,甚至不要走得太远。
使用:
- Dev-C ++ v4.9.9.2
- WinXP的
以下是示例应用程序的结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | C:. | Makefile.win | Project1.dev | \\---src | bar.cpp | bar.h | foo.cpp | foo.h | main.cpp | +---inc | debug.h | \\---log |
src / bar.h:
1 2 3 4 5 6 7 8 9 | #ifndef BAR_H #define BAR_H class Bar { public: Bar(); }; #endif |
src / bar.cpp:
1 2 3 4 5 6 | #include"bar.h" Bar::Bar() { // debug("I am Bar."); } |
src / foo.h和src / foo.cpp相同,只是将" Bar"更改为" Foo"
使用我在其他文章中找到的信息...
src / inc / debug.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #ifndef MY_DEBUG_H #define MY_DEBUG_H #include <iostream> #include <fstream> #include <string> #ifndef LOGFILE #define LOGFILE std::ofstream logfile("log/debug.txt", std::ios::app); #endif #ifndef debug #define debug(s) LOGFILE <<"[" << __DATE__ <<"" << __TIME__ \\ <<"]" << __FILE__ <<":" << __LINE__ <<"" << s << std::endl #endif #endif |
src / main.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 | #include"inc/debug.h" #include"foo.h" #include"bar.h" #include <iostream> int main (int argc, char **argv) { debug("Starting program."); Foo *f = new Foo(); Bar *b = new Bar(); } |
当我尝试对此进行编译时,我在main.cpp的
有人可以告诉我是什么导致了此错误,这也是一种可以在其他文件/类中应用调试消息的好方法,即取消注释以下行:
1 2 | // debug("I am Bar."); // debug("I am Foo."); |
分别在bar.cpp和foo.cpp中,并在其他任何地方使用debug()?
谢谢你的帮助。
因此,您几乎可以替换cout / cerr输出为直接指向文件。 例如,有关示例,请参见http://www.cplusplus.com/reference/iostream/ios/rdbuf/。 然后只需正常使用cout / cerr。 您可能必须对冲洗等操作保持谨慎,至少要实时读取它。
您对日志文件的定义搞砸了。
对代码进行预处理后,您将获得:
1 2 | std::ofstream logfile("log/debug.txt", std::ios::app); <<"[" << __DATE__ <<"" << __TIME__ \\ <<"]" << __FILE__ <<":" << __LINE__ <<"" <<"Starting Program" << std::endl; |
您需要在头文件中执行以下操作:
1 | extern std::ofstream LOG_FILE; |
并在某些cpp文件中(也许是main.cpp文件中):
1 2 | #include"debug.h" std::ofstream LOG_FILE("log/debug.txt",std::ios::app); |
要禁用调试,您可以执行以下操作:
1 | #define debug(ignore)((void) 0) |
与其他调试定义相比,未启用调试标志时。
您也可以将类初始化放在类似的