Реинициализировать временную структуру

Как я могу повторно инициализировать структуру timeval из time.h?

Я понимаю, что могу сбросить оба члена структуры до нуля, но есть ли какой-то другой метод, который я пропускаю?

5 ответов

Решение

Полностью правильный и переносимый (хотя и 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;

Как и в ответе Р. и ответе Немо, он также будет обрабатывать указатели 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тогда вы также обнуляете любых платформо-зависимых членов.

Другие вопросы по тегам