我正在看一些代码示例。在.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