首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IF语句具有奇怪的行为

问IF语句具有奇怪的行为
EN

Stack Overflow用户
提问于 2010-06-18 23:35:23
回答 3查看 306关注 0票数 1

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

问题是,即使当前的详细级别太低,我也会打印消息。我继续对其进行调试,希望找到问题所在。相反,我发现我的if语句不能像预期的那样工作的情况有很多种。

即使ilralevel_set小于ilralevel_passed,if(ilralevel_passed <= ilralevel_set)语句有时也会继续。你可以在下面的图片中看到这种行为(我为使用推特道歉) http://twitpic.com/1xtx4g/full。注意ilralevel_set是如何等于0的,而ilralevel_passed是如何等于1的。然而,if语句已经返回true,现在正在向前移动以将行传递给cout。

我以前从来没有见过这种类型的行为,我不确定如何继续调试它。我也不能隔离行为--它只发生在我的程序的某些部分。我们将一如既往地感谢您的建议。

代码语言:javascript
复制
//  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_ */
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-18 23:45:34

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

你几乎肯定想要的是

代码语言:javascript
复制
int ilralevel_set = 0;
int ilralevel_passed;

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

代码语言:javascript
复制
extern int ilralevel_set;
extern int ilralevel_passed;

在标题中。或者,看起来您可以将其全部移动到类中:

代码语言:javascript
复制
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; }
    // ...
};
票数 6
EN

Stack Overflow用户

发布于 2010-06-18 23:41:32

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

代码语言:javascript
复制
static int ilralevel_set = 0;
static int ilralevel_passed;

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

要在类中声明:

代码语言:javascript
复制
struct A {
   static int ilralevel;
};

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

代码语言:javascript
复制
int A::ilralevel = 0;
票数 5
EN

Stack Overflow用户

发布于 2010-06-18 23:43:40

只是猜测..。在不同的编译单元中,您会得到静态全局变量的不同副本。fx,route.cpp有它自己的ilralevel_passed和ilralevel_set副本,外加irla::operator<<的内联副本。将ilralevel_passed移到irla的成员变量中,并将ilralevel_set移到static const中,看看这是否有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3071020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档