2013-05-07 46 views
1

我正在看一些代碼示例。在.h文件中有這樣的聲明:爲未來的「未設置」變量定義一個外部變量是否是一種好的做法?

extern int NODATA;

它在其他許多文件中用於沒有邏輯值的變量。

是否有必要將其定義在其他地方或可以將其定義爲不確定?

+2

如果未定義,則無法使用。你確定它沒有在相應的'.cpp'文件中定義嗎? – 2013-05-07 14:57:33

+0

如果你不想使用它,可以不定義它。但是這會使代碼變得不易閱讀和誤導。 – 2013-05-07 15:00:01

+1

@AlexFarber如果他不確定,他就不能使用它。如果他不使用它,宣佈它是沒有意義的。 – 2013-05-07 15:05:48

回答

0

它是如何使用的?如果按值使用,那麼它必須在某處定義爲 ,並且它將採用默認值爲 初始化程序—中給出的值(當然,它應該是 const。)如果它是隻用於地址(即&NODATA),那麼 仍然需要在某處定義。但在這種情況下, 慣用約定是使用空指針:NULL(或0, 或者如果您有C++ 11,nullptr),否則沒有理由以其他方式執行 ,並且您沒有定義其他任何東西。

0

它可能是在技術上允許它不被定義在任何地方取決於你的意思是「使用」,但我當然不會稱之爲好的做法。舉例來說,以下(hackish)程序。請注意,它使用新的C++ 11功能,但NODATA的一些用途也適用於C++ 03。

#include <iostream> 
using std::cout; 
using std::endl; 

extern int NODATA; 

auto size = sizeof(NODATA); 
auto align = alignof(NODATA); 

void f(int c = NODATA) 
{ 
    cout << "c=" << c << endl; 
} 

decltype(NODATA) main() 
{ 
    cout << "size=" << size << endl; 
    cout << "align=" << align << endl; 

    f(0); 

    // above here should all work, below may not depending on 
    // implementation and its optimization settings 

    if(false && NODATA) 
    { 
     cout << "false && NODATA" << endl; 
    } 
    else if(true || NODATA) 
    { 
     cout << "true || NODATA" << endl; 
    } 
    else 
    { 
     int i = NODATA; 
    } 

    // this would definitely cause a linker error 
    // f(); 
    // but this may not 
    false ? f() : f(1); 

    f((NODATA-NODATA) + 2); 
    f((NODATA/NODATA) + 2); 
    f((4*NODATA)/NODATA); 

    int arry[3] = { [0] = 1, [1] = NODATA, [1] = 2 }; 

    struct { 
     int first; 
     int second; 
     int third; 
    } strct = {.first = 1, .second = NODATA, .second = 2}; 

    return NODATA^NODATA; 

    int i = NODATA; 
} 

儘管一些結構會盡管NODATA沒有任何地方定義(見http://ideone.com/hyjOxR爲例運行),我很難想到的任何理由在實際使用當中的事實工作。

根據您的描述,但是,它聽起來就像是文件的其餘部分使用NODATA到initiliaze和/或對其它變量測試(可能不能全部被優化掉):

#include "NODATA.h" 

int aVariableThatIsActuallyUsed = NODATA; 

void SomeInitFunc(void) 
{ 
    aVariableThatIsActuallyUsed = 42; 
} 

int SomeOtherFunc(void) 
{ 
    if(NODATA == aVariableThatIsActuallyUsed) 
    { 
     throw SomeException(); 
    } 

    aVariableThatIsActuallyUsed--; 

    return aVariableThatIsActuallyUsed; 
} 

如果是這樣,那麼必須定義NODATA,無論是在C++源文件,程序集文件,庫還是其他地方。你知道一個事實,該程序編譯和運行沒有錯誤?

相關問題