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

C++ Determining if a variable is set

本文关键字:变量 设置 是否 C++      更新时间:2023-10-16

我有一个定义的变量:

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_initialize=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所有参数的访问,然后你可以为不同的平台或其他平台选择不同的时间实现,最后,您可以编写运算符/方法,为您做一些常见的事情(时间比较、delta时间、秒表等)。