重新初始化timeval结构
Reinitialize timeval struct
如何从time.h重新初始化timeval结构?
我知道我可以将结构的两个成员都重置为零,但是否有其他方法我忽略了?
完全正确且可移植(尽管是C99)的零初始化任意(可能是聚合)类型的方法:
myTime = (struct timeval){0};
这甚至适用于包含指针和浮点成员的结构,即使实现没有使用所有零位作为空指针和浮点零的表示。
memset
可能恰好在您的平台上工作,但它实际上不是推荐的(可移植的)方法。。。
这是:
struct timeval myTime;
myTime = (struct timeval){ 0 };
memset
之所以有效,是因为struct timeval
的所有元素碰巧都有零值,这些零值由平台上的全零位模式表示。
但规范并不要求这样做。特别是,POSIX不要求time_t
类型是整数,C不要求浮点零表示为全零字节。
使用初始值设定项语法可以确保结构的字段正确地设置为零,无论它们是整数、浮点、指针还是其他结构。。。即使这些东西的表示在记忆中不是全部为零。一般情况下,memset
的情况并非如此。
假设您希望struct timeval
结构重新初始化为零值,而不管它们是浮点类型还是积分类型,也不管浮点类型的零表示,一个将与C90或更高版本或C++一起使用的方法:
static struct timeval init_timeval; // or whatever you want to call it
// ...
myTime = init_timeval;
正如R的答案和Nemo的答案一样,这也将处理NULL指针,而不管它们如何表示。我无法想象为什么struct timeval
会有指针,但我提到这一点是因为该技术对struct timeval
以外的结构很有用。
与其他答案相比,它的缺点是需要在某个地方定义一个静态或全局变量。优点是它可以与非C99编译器配合使用。
如果你正在寻找一个单行,我想你也可以使用memset来完成任务:
struct timeval myTime;
/* snip ... myTime is now initialized to something */
memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
您可以使用memset
,然后还可以将任何特定于平台的成员清零。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- 将 Timeval 结构转换为 C#
- 重新初始化timeval结构