我正在看一些代碼示例。在.h文件中有這樣的聲明:爲未來的「未設置」變量定義一個外部變量是否是一種好的做法?
extern int NODATA;
它在其他許多文件中用於沒有邏輯值的變量。
是否有必要將其定義在其他地方或可以將其定義爲不確定?
我正在看一些代碼示例。在.h文件中有這樣的聲明:爲未來的「未設置」變量定義一個外部變量是否是一種好的做法?
extern int NODATA;
它在其他許多文件中用於沒有邏輯值的變量。
是否有必要將其定義在其他地方或可以將其定義爲不確定?
它是如何使用的?如果按值使用,那麼它必須在某處定義爲 ,並且它將採用默認值爲 初始化程序—中給出的值(當然,它應該是 const。)如果它是隻用於地址(即&NODATA
),那麼 仍然需要在某處定義。但在這種情況下, 慣用約定是使用空指針:NULL
(或0
, 或者如果您有C++ 11,nullptr
),否則沒有理由以其他方式執行 ,並且您沒有定義其他任何東西。
它可能是在技術上允許它不被定義在任何地方取決於你的意思是「使用」,但我當然不會稱之爲好的做法。舉例來說,以下(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++源文件,程序集文件,庫還是其他地方。你知道一個事實,該程序編譯和運行沒有錯誤?
如果未定義,則無法使用。你確定它沒有在相應的'.cpp'文件中定義嗎? – 2013-05-07 14:57:33
如果你不想使用它,可以不定義它。但是這會使代碼變得不易閱讀和誤導。 – 2013-05-07 15:00:01
@AlexFarber如果他不確定,他就不能使用它。如果他不使用它,宣佈它是沒有意義的。 – 2013-05-07 15:05:48