IF语句有奇怪的行为

时间:2010-06-18 15:35:23

标签: c++ debugging if-statement

我开发了一个'自定义'cout,这样我就可以将文本显示到控制台并将其打印到日志文件中。这个cout类在初始化时传递一个不同的整数,整数表示消息的详细级别。如果当前详细级别大于或等于消息的详细级别,则应打印该消息。

问题是,即使当前的详细程度太低,我也会打印消息。我继续调试它,期待找到问题。相反,我发现我的if语句没有按预期工作的多个场景。

如果(ilralevel_passed< = ilralevel_set)语句有时会继续进行,即使ilralevel_set为LESS然后ilralevel_passed。您可以在下图中看到此行为(我为使用Twitpic而道歉)http://twitpic.com/1xtx4g/full。注意ilralevel_set如何等于零,ilralevel_passed等于1。然而,if语句已经返回true,现在正在向前传递给cout。

我之前从未见过这种行为,而且我不确定如何继续调试它。我无法隔离行为 - 它只发生在我程序的某些部分。任何建议都会一如既往地受到赞赏。

//  Here is an example use of the function:
//  ilra_status << setfill('0') << setw(2) << dispatchtime.tm_sec << endl;
//  ilra_warning << "Dispatch time (seconds): " << mktime(&dispatchtime) << endl;

//  Here is the 'custom' cout function:
    #ifndef ILRA_H_
    #define ILRA_H_

    // System libraries
    #include <iostream>
    #include <ostream>
    #include <sstream>
    #include <iomanip>

    // Definitions
    #define ilra_talk ilra(__FUNCTION__,0)
    #define ilra_update ilra(__FUNCTION__,0)
    #define ilra_error ilra(__FUNCTION__,1)
    #define ilra_warning ilra(__FUNCTION__,2)
    #define ilra_status ilra(__FUNCTION__,3)

    // Statics
    static int ilralevel_set = 0;
    static int ilralevel_passed;

    // Classes
    class ilra
    {
    public:
        // constructor / destructor
        ilra(const std::string &funcName, int toset)
        {
            ilralevel_passed = toset;
        }
        ~ilra(){};

        // enable / disable irla functions
        static void ilra_verbose_level(int toset){
            ilralevel_set = toset;
        }

        // output
        template <class T>
        ilra &operator<<(const T &v)
        {
            if(ilralevel_passed <= ilralevel_set)
                std::cout << v;
            return *this;
        }

        ilra &operator<<(std::ostream&(*f)(std::ostream&))
        {
            if(ilralevel_passed <= ilralevel_set)
                std::cout << *f;
            return *this;
        }

    };  // end of the class

    #endif /* ILRA_H_ */

3 个答案:

答案 0 :(得分:6)

当您在类外部定义静态变量时,您要为包含标题的每个源文件定义一个单独的变量 - 将值更改为一个不会影响具有相同名称的变量的值在另一个文件中。

你几乎肯定想要的是

int ilralevel_set = 0;
int ilralevel_passed;

一个文件中,您要定义对象,并且:

extern int ilralevel_set;
extern int ilralevel_passed;
标题中的

。或者,看起来你可以在课堂上全部移动它:

class ilra { 
    int passed_level;
    int set_level;
public:
    ilra(int toset) : passed_level(toset), set_level(0) {}

    verbose_level(int toset) { set_level = toset; }
    // ...
};

答案 1 :(得分:5)

您不应该在头文件中定义静态变量,如下所示:

static int ilralevel_set = 0;
static int ilralevel_passed;

我不知道你认为这些定义是做什么的,但它们可能不会做你想要的。

在课堂上宣布:

struct A {
   static int ilralevel;
};

然后,您需要在一个 .cpp源文件中定义:

int A::ilralevel = 0;

答案 2 :(得分:1)

只是猜测..你在不同的编译单元中获得静态全局变量的不同副本。 fx,route.cpp拥有自己的ilralevel_passedilralevel_set副本,以及irla::operator<<的内联副本。将ilralevel_passed移至irla的成员变量,将ilralevel_set移至static const,看看是否有帮助。