我有一个定义的变量:
SYSTEMTIME m_TOTime;
我调用GetSystemTime函数来获取UTC时间:
GetSystemTime( &m_TOTime );
是否可以确定是否已调用GetSystemTime来设置m_TOTime?我有另一个使用此变量的函数,但如果没有调用GetSystemTime(有时它不一定),则返回一个空白对象。我希望像m_TOTime == null之类的东西能起作用。
答案 0 :(得分:8)
使用初始化程序。
SYSTEMTIME m_TOTime = { 0 }; // Initialize structure to zero
...
if (m_TOTime.wYear != 0)
// structure has been initialized
一般情况下,如果变量的所有可能值都是“合法的”,则不能这样做,但假设时间旅行是不可能的,那么在调用GetSystemTime()之后年份永远不会为零。
如果所有可能的值都合法,则需要使用辅助“bool m_TOTime_initialized = false”变量或其他类似的值。
答案 1 :(得分:1)
您应该使用一个不能通过调用GetSystemTime
的结果来初始化它。最有可能的值是0应该完成工作 - 通常系统时间从过去的任意时刻开始计算,如1970年1月1日00:00:00,这不会再发生:-)和计数器可能会在将来的某个时候结束,但它应该发生在相当遥远的未来,如2038 *。在那之前,你可能是安全的: - )
*具体细节是特定的。
答案 2 :(得分:1)
您可以为变量指定一些魔术值。例如,
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
}
答案 3 :(得分:1)
另一种方法,将其包装在一个初始化构造的类中:
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的所有参数,然后你可以选择一个不同的时间不同平台或其他任何平台的实现,最后你可以编写为你做常见事情的操作符/方法(时间比较,增量时间,秒表等)。