【发布时间】:2011-09-21 16:04:42
【问题描述】:
如何从 time.h 重新初始化 timeval 结构?
我知道我可以将结构的两个成员都重置为零,但是我忽略了其他一些方法吗?
【问题讨论】:
-
重新初始化为什么?如何在初始化满意后复制它,然后将其复制回原件以重置它?
如何从 time.h 重新初始化 timeval 结构?
我知道我可以将结构的两个成员都重置为零,但是我忽略了其他一些方法吗?
【问题讨论】:
对任意(可能是聚合)类型进行零初始化的完全正确且可移植(尽管是 C99)的方法:
myTime = (struct timeval){0};
这甚至适用于包含指针和浮点成员的结构,即使实现不使用全零位作为空指针和浮点零的表示。
【讨论】:
{0} 总是 在 C 中有效,即使第一个元素是另一个结构(或者即使根本不涉及结构或联合)。
{0} 的初始化程序很有用,但 GCC 不应该警告那种习惯于“我希望这个结构零初始化”的特定形式。
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.'s answer 和Nemo's answer 一样,这也将处理NULL 指针,无论它们如何表示。我无法想象为什么struct timeval 会有一个指针,但我提到这一点是因为该技术对struct timeval 以外的结构很有用。
与其他答案相比,它的缺点是它需要在某处定义静态或全局变量。优点是它可以与非 C99 编译器一起使用。
【讨论】:
const 以避免浪费bss/data。此外,如果您编写const struct timeval init_timeval = {0};(注意我删除了static),编译器可能足够聪明,可以消除生成任何代码以实际创建自动对象并只生成memset-等效代码当你写my_timeval = init_timeval;...
如果您正在寻找单线,我想您也可以使用 memset 来完成这项工作:
struct timeval myTime;
/* snip ... myTime is now initialized to something */
memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
【讨论】:
c++ 重新标记到 c。现在,所有答案实际上都不适用于 OP 的 C++ 代码。
您可以使用memset,然后您还可以将任何特定于平台的成员归零。
【讨论】: