C++ C++;确定是否设置了变量

C++ C++;确定是否设置了变量,c++,C++,我定义了一个变量: SYSTEMTIME m_TOTime; 我调用GetSystemTime函数来获取UTC时间: GetSystemTime( &m_TOTime ); 是否可以确定是否已调用GetSystemTime来设置m_TOTime?我有另一个使用这个变量的函数,但是如果还没有调用GetSystemTime(有时不必调用),它将返回一个空对象。我希望像m_TOTime==null这样的东西能起作用。使用初始值设定项 SYSTEMTIME m_TOTime = { 0 };

我定义了一个变量:

SYSTEMTIME m_TOTime;
我调用GetSystemTime函数来获取UTC时间:

GetSystemTime( &m_TOTime );
是否可以确定是否已调用GetSystemTime来设置m_TOTime?我有另一个使用这个变量的函数,但是如果还没有调用GetSystemTime(有时不必调用),它将返回一个空对象。我希望像m_TOTime==null这样的东西能起作用。

使用初始值设定项

SYSTEMTIME m_TOTime = { 0 };  // Initialize structure to zero

...

if (m_TOTime.wYear != 0)
    // structure has been initialized
通常,如果变量的所有可能值都是“合法”的,则无法执行此操作,但假设时间旅行是不可能的,则在调用GetSystemTime()后,年份将永远不会为零


如果所有可能的值都是合法的,则需要使用一个辅助变量“bool m_TOTime_initialized=false”或类似的变量。

您应该使用一个不能作为调用
GetSystemTime
的结果的值来初始化它。最有可能的情况是,值为0就可以完成这项工作-通常系统时间是从过去的任意时刻开始计算的,比如1970年1月1日00:00:00,这不会再次发生:-)计数器可能在将来某个时候运行,但它应该在相当遥远的将来发生,比如2038*。在此之前,您可能会安全:-)


*确切的细节是特定于操作系统的。

您可以为变量分配一些神奇的值。比如说,

SYSTEMTIME m_TOTime = {0}; // This should set all struct to 0
然后您可以检查它
GetSystemTime
是否被这样调用:

if (m_TOTime.wYear != 0) {
    // we have set the value with the GetSystemTime call
}
当然,您可以选择除
0
之外的其他内容,例如
-1
或保证不会由
GetSystemTime
返回的值

或者,您可以使用一个布尔标志来告诉您是否设置了变量:

SYSTEMTIME m_TOTime;
bool m_TOTime_set = false;
...
GetSystemTime(m_TOTime);
m_TOTime_set = true;
...
if (m_TOTime_set) {
    // do stuff here
}

另一种方法是,将其封装在一个在构造时初始化的类中:

class clock
{
public:
    clock()
    {
        system();
    }

    void system()
    {
        GetSystemTime(&time_);
    }

    void local()
    {
        GetLocalTime(&time_);
    }

    const SYSTEMTIME& get() const
    {
        return time_;
    }

private:
    SYSTEMTIME time_;
};

这可能有点过头了,但您可以避免epoch包装的问题(假设GetBlahTime将来会适当更改),此外,您还可以执行额外的步骤,包装对SYSTEMTIME的所有参数的访问,然后您可以为不同的平台或任何东西选择不同的时间实现,最后,您可以编写运算符/方法来为您完成常见的事情(时间比较、增量时间、秒表等)。

是的,只是查阅了文档。修复了响应。