我已经开发了一个“自定义”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。
我以前从来没有见过这种类型的行为,我不确定如何继续调试它。我也不能隔离行为--它只发生在我的程序的某些部分。我们将一如既往地感谢您的建议。
// 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_ */发布于 2010-06-18 23:45:34
当您在类外部定义静态变量时,您将为每个包含头文件的源文件定义一个单独的变量--更改其中的值不会影响另一个文件中同名变量的值。
你几乎肯定想要的是
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; }
// ...
};发布于 2010-06-18 23:41:32
您不应该在头文件中定义静态变量,如下所示:
static int ilralevel_set = 0;
static int ilralevel_passed;我不知道你认为这些定义是做什么的,但它们可能不会做你想要的事情。
要在类中声明:
struct A {
static int ilralevel;
};然后,您需要在one .cpp源文件中定义:
int A::ilralevel = 0;发布于 2010-06-18 23:43:40
只是猜测..。在不同的编译单元中,您会得到静态全局变量的不同副本。fx,route.cpp有它自己的ilralevel_passed和ilralevel_set副本,外加irla::operator<<的内联副本。将ilralevel_passed移到irla的成员变量中,并将ilralevel_set移到static const中,看看这是否有帮助。
https://stackoverflow.com/questions/3071020
复制相似问题