C++ 为future';取消设置';变量?

C++ 为future';取消设置';变量?,c++,extern,C++,Extern,我正在看一些代码示例。在.h文件中,有以下声明: 节点外部 它在许多其他文件中用于没有逻辑值的变量 是否有必要在其他地方定义它,还是可以不定义它?如何使用它?如果它由值使用,则必须定义它 在某个地方,它将接受 默认情况下,初始值设定项为0。(当然,应该是这样 常量。)如果它仅由地址使用(即和NODATA),则 仍然需要在某个地方定义。但在这种情况下 惯用的惯例是使用空指针:null(或0), 或者,如果您有C++11,nullptr),则没有理由这样做 否则,您也不必定义任何其他内容 从技术上讲

我正在看一些代码示例。在.h文件中,有以下声明:

节点外部

它在许多其他文件中用于没有逻辑值的变量


是否有必要在其他地方定义它,还是可以不定义它?

如何使用它?如果它由值使用,则必须定义它 在某个地方,它将接受 默认情况下,初始值设定项为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;
}