c++ - IF 语句有奇怪的行为

标签 c++ debugging if-statement

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

问题是,即使当前的详细级别太低,我也会打印消息。我继续调试它,期望找到问题所在。相反,我发现了多种情况,其中我的 if 语句没有按预期工作。

语句 if(ilralevel_passed <= ilralevel_set) 有时会继续执行,即使 ilralevel_set 小于 ilralevel_passed。您可以在下图中看到此行为(我为使用 Twitpic 道歉)http://twitpic.com/1xtx4g/full .请注意 ilralevel_set 是如何等于零,而 ilralevel_passed 是如何等于一的。然而,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_ */

最佳答案

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

你几乎肯定想要的是拥有

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; }
    // ...
};

关于c++ - IF 语句有奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3071020/

相关文章:

visual-studio-2008 - 调试时,Visual Studio 总是在最前面

java - 调试 GWT 生成的类

python - 在 Python 中为不同的日期格式创建一个解析函数

java - 从 'a' || 简化 s.charAt 'b' || 'c' ||到一个 s.charAt

c++ - 为什么这里要调用拷贝构造函数呢?

c++ - 将 double 值舍入为(稍微)较低精度的好方法是什么?

c++ - 使用 Xcode 7 GUI (lldb) 调试 C++ 库源代码

javascript - 如何在 angularjs 的 View 中使用 ng-if 值检查 null?

c++ - 我如何计算 C++ 中的操作?

c++ - 如何将 PHI 节点添加到每个基本 block 的开头