关于C ++:如何使用预处理程序定义向应用程序添加简单调试

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的debug("Starting program.");行收到一条错误消息,提示expected primary-expression before '<<' token

有人可以告诉我是什么导致了此错误,这也是一种可以在其他文件/类中应用调试消息的好方法,即取消注释以下行:

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)

与其他调试定义相比,未启用调试标志时。

您也可以将类初始化放在类似的#ifdef块中,以避免在不使用文件时打开文件。