C++ IF语句有奇怪的行为

C++ IF语句有奇怪的行为,c++,debugging,if-statement,C++,Debugging,If Statement,我开发了一个“自定义”cout,这样我就可以在控制台上显示文本,还可以将其打印到日志文件中。这个cout类在初始化时被传递一个不同的整数,该整数表示消息的详细级别。如果当前详细级别大于或等于消息的详细级别,则应打印消息 问题是,即使当前的详细级别太低,我也会打印消息。我继续调试它,期望找到问题。相反,我发现我的if语句无法按预期工作的多个场景 如果(ilralevel_)语句通过,则不应在头文件中定义如下静态变量: static int ilralevel_set = 0; static int

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

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


如果(ilralevel_)语句通过,则不应在头文件中定义如下静态变量:

static int ilralevel_set = 0;
static int ilralevel_passed;
我不知道你认为这些定义有什么作用,但它们可能不符合你的要求

要在类中声明:

struct A {
   static int ilralevel;
};
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; }
    // ...
};
然后需要在一个.cpp源文件中定义:

int A::ilralevel = 0;

您不应该像这样在头文件中定义静态变量:

static int ilralevel_set = 0;
static int ilralevel_passed;
我不知道你认为这些定义有什么作用,但它们可能不符合你的要求

要在类中声明:

struct A {
   static int ilralevel;
};
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; }
    // ...
};
然后需要在一个.cpp源文件中定义:

int A::ilralevel = 0;

只是一个猜测。你在不同的编译单元中得到了静态全局变量的不同副本。fx,
route.cpp
有它自己的
ilralevel\u passed
ilralevel\u set
,加上
irla::operator的内联副本只是一个猜测。你在不同的c中得到了静态全局变量的不同副本compilation units.fx,
route.cpp
有它自己的
ilralevel\u passed
ilralevel\u set
的副本,加上
irla::operator的内联副本。当您在类外定义静态变量时,您正在为包含头的每个源文件定义一个单独的变量——在一个do中更改值esn不会影响另一个文件中同名变量的值

你几乎肯定想要的是拥有

int ilralevel_set = 0;
int ilralevel_passed;
在定义对象的一个文件中,以及:

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

struct A {
   static int ilralevel;
};
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; }
    // ...
};

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

你几乎肯定想要的是拥有

int ilralevel_set = 0;
int ilralevel_passed;
在定义对象的一个文件中,以及:

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

struct A {
   static int ilralevel;
};
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; }
    // ...
};


我还可以如何将它们定义为静态变量?您不能在类中定义它们(实际上,这是另一个答案,因此我在头文件中定义了它们)@BSchlinker我真的不明白你在用它们做什么,但是你当然可以在类中定义它们。@尼尔-不,你不能。你可以声明它们。在积分的情况下,你可以初始化它们。你不能定义它们;不能在类声明中定义它们。@Noah你是对的。我已经更新了我的答案-不能更新注释。我确信这将解决OP的所有问题。@Noah什么是错误的?如果您不喜欢我的答案,请发布您自己的答案或编辑我的答案。否则我如何将它们定义为静态变量?您不能在类中定义它们(这实际上是另一个答案,因此我在头文件中定义了它们)@BSchlinker我真的不明白你在用它们做什么,但是你当然可以在类中定义它们。@尼尔-不,你不能。你可以声明它们。在积分的情况下,你可以初始化它们。你不能定义它们;不能在类声明中定义它们。@Noah你是对的。我已经更新了我的答案-不能更新注释。我确信这将解决OP的所有问题。@Noah什么是错误的?如果你不喜欢我的答案,发布你自己的答案或编辑我的答案。在类中移动整数将使我的静态函数无法使用它们。因为我不创建对象并直接调用类中的函数,这是一项要求。如果我要创建作为一个对象,我需要不断地为每个单独的对象创建它。@BSchlinker:如果不创建对象,为什么要使用类呢?对于这种情况,您可能应该在名称空间中只包含函数(和变量)。我试图阻止使用全局变量(这是我所知道的在两个独立函数之间存储变量的唯一方法)。我也不太熟悉名称空间的用法。请参阅:@BSchlinker:假设变量仅从函数访问/由函数访问,则根本不需要在标头中声明它们。只需在实现中定义它们,在标头中声明它们,就可以了。现在出现问题,因为您正在类中定义它们定义,所以它们是内联函数,将在本地访问变量。仅在头文件中声明的普通函数将访问定义它们的变量。@Jerry:我当前在类定义中定义它们?它们在类括号的范围之外--在主头文件本身内。I这不是“在标题中声明它们”吗?在类中移动整数将使我的静态函数无法使用它们。因为我不创建对象并直接调用类中的函数,这是一项要求。如果我要创建对象,我需要不断为每个对象创建它。@BSchlinker:如果不创建对象,为什么要使用类?对于这种情况,您可能应该在名称空间中只包含函数(和变量)。我试图阻止使用全局变量(这是我所知道的在两个单独函数之间存储变量的唯一方法)。我也不太熟悉名称空间的用法。请参阅:@BSchlinker:assumin