我開發了一個'自定義'cout,以便我可以向控制檯顯示文本並將其打印到日誌文件。這個cout類在初始化時傳遞了一個不同的整數,整數代表了消息的詳細程度。如果當前的詳細級別大於或等於消息的詳細級別,則應打印該消息。IF聲明有奇怪的行爲
問題是,即使當前詳細程度級別太低,我也會打印郵件。我繼續調試它,期待找到問題。相反,我發現了多個場景,其中我的if語句無法按預期工作。
if(ilralevel_passed < = ilralevel_set)語句有時會繼續,即使ilralevel_set是LESS,然後ilralevel_passed。你可以在下面的圖片中看到這種行爲(我使用Twitpic道歉)http://twitpic.com/1xtx4g/full。注意ilralevel_set等於零,ilralevel_passed等於1。然而,if語句已經恢復正確,現在正在向前推進,以便將該線路傳遞給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_ */
移動類中的整數將使我的靜態函數無法使用它們。由於我不創建對象並直接調用類中的函數,因此這是一項要求。如果我要創建一個對象,我需要不斷爲每個單獨的對象創建它。 – BSchlinker 2010-06-18 16:04:33
@BSchlinker:如果你不創建一個對象,你爲什麼要使用一個類?對於這樣的情況,你可能只需要在命名空間中有函數(和變量)。 – 2010-06-18 16:07:00
我嘗試阻止使用全局變量(這是我知道的用於在兩個獨立函數之間存儲變量的唯一方法)。我對命名空間的用法也不是很熟悉。 請參閱:http://stackoverflow.com/questions/3035582/static-variables-in-overloaded-functions – BSchlinker 2010-06-18 16:16:32