2013-05-07 49 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++源文件,程序集文件,库还是其他地方。你知道一个事实,该程序编译和运行没有错误?

相关问题