如何使用预处理器定义向Application添加简单的调试

时间:2011-06-01 04:31:24

标签: c++ c

我正在WinXP上开发一个GUI应用程序但不幸的是std :: cerr / cout无处可去。我想添加一个简单的调试方法,将消息附加到日志文件。

我一直在寻找一个几乎可行的解决方案来阅读其他帖子。并且我能够在我的GUI应用程序中调用一个debug()方法。但是,在我试图用来寻找解决方案的下面的示例应用程序中,甚至没有那么远。

使用:

  • Dev-C ++ v4.9.9.2
  • 的WinXP

以下是我的示例应用的结构:

C:.
|   Makefile.win
|   Project1.dev
|
\---src
    |   bar.cpp
    |   bar.h
    |   foo.cpp
    |   foo.h
    |   main.cpp
    |
    +---inc
    |       debug.h
    |
    \---log

的src / bar.h:

#ifndef BAR_H
#define BAR_H

class Bar
{
public:
    Bar();  
};
#endif

的src / bar.cpp:

#include "bar.h"

Bar::Bar()
{
//    debug("I am Bar.");
}
除了将'Bar'更改为'Foo'

之外,

src / foo.h和src / foo.cpp是相同的

使用我在其他文章中找到的信息......

的src / INC / debug.h:

#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中:

#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时收到错误。

有人能告诉我导致此错误的原因,也是一个很好的方法,然后能够在其他文件/类中应用调试消息,即取消注释行:

//    debug("I am Bar.");
//    debug("I am Foo.");
分别在bar.cpp和foo.cpp中使用debug()并在其他任何地方使用?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

你的日志文件定义搞砸了。

当您的代码经过预处理后,您将获得:

std::ofstream logfile("log/debug.txt", std::ios::app); << "[" << __DATE__ << " " << __TIME__ \
        << "] " << __FILE__ << ":" << __LINE__ << " " << "Starting Program" << std::endl;

你需要做的是在头文件中这样的事情:

extern std::ofstream LOG_FILE;

和某些cpp文件(也许是你的main.cpp文件):

#include "debug.h"
std::ofstream LOG_FILE("log/debug.txt",std::ios::app);

要禁用调试,您可以执行以下操作:

#define debug(ignore)((void) 0)

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

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

答案 1 :(得分:0)

Tbh你几乎可以将cout / cerr输出替换为直接指向文件。例如,请参阅http://www.cplusplus.com/reference/iostream/ios/rdbuf/作为示例。然后正常使用cout / cerr。你可能必须小心冲洗等,至少如果你想实时阅读它。