C++ 为future';取消设置';变量?
我正在看一些代码示例。在.h文件中,有以下声明: 节点外部 它在许多其他文件中用于没有逻辑值的变量C++ 为future';取消设置';变量?,c++,extern,C++,Extern,我正在看一些代码示例。在.h文件中,有以下声明: 节点外部 它在许多其他文件中用于没有逻辑值的变量 是否有必要在其他地方定义它,还是可以不定义它?如何使用它?如果它由值使用,则必须定义它 在某个地方,它将接受 默认情况下,初始值设定项为0。(当然,应该是这样 常量。)如果它仅由地址使用(即和NODATA),则 仍然需要在某个地方定义。但在这种情况下 惯用的惯例是使用空指针:null(或0), 或者,如果您有C++11,nullptr),则没有理由这样做 否则,您也不必定义任何其他内容 从技术上讲
是否有必要在其他地方定义它,还是可以不定义它?如何使用它?如果它由值使用,则必须定义它 在某个地方,它将接受 默认情况下,初始值设定项为0。(当然,应该是这样 常量。)如果它仅由地址使用(即
和NODATA
),则
仍然需要在某个地方定义。但在这种情况下
惯用的惯例是使用空指针:null
(或0
),
或者,如果您有C++11,nullptr
),则没有理由这样做
否则,您也不必定义任何其他内容 从技术上讲,允许根据您所说的“使用”的含义,不在任何地方定义它,但我肯定不会称之为良好实践。以下面的(黑客)程序为例。请注意,它使用了新的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;
}
如果是,则必须定义代码> NoDATAs/COD>,无论是C++源文件、汇编文件、库还是其他地方。您知道程序编译和运行时没有错误吗?
如果未定义,则无法使用它。您确定它没有在相应的.cpp
文件中定义吗?如果您不想使用它,可以让它未定义。但这会降低代码的可读性和误导性。@AlexFarber如果不定义代码,就不能使用它。如果他不使用它,声明它就没有意义了。“sftababt它不必在C++源代码中定义。例如,它可能位于程序集或库文件中。@James Kanze-这正是我的帖子中所写的:)
#include "NODATA.h"
int aVariableThatIsActuallyUsed = NODATA;
void SomeInitFunc(void)
{
aVariableThatIsActuallyUsed = 42;
}
int SomeOtherFunc(void)
{
if(NODATA == aVariableThatIsActuallyUsed)
{
throw SomeException();
}
aVariableThatIsActuallyUsed--;
return aVariableThatIsActuallyUsed;
}