Реинициализировать временную структуру - PullRequest
7 голосов
/ 24 июня 2011

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

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

Ответы [ 5 ]

12 голосов
/ 24 июня 2011

Полностью правильный и переносимый (хотя и C99) способ инициализации нуля произвольных (возможно, агрегатных) типов:

myTime = (struct timeval){0};

Это работает даже для структур, которые содержат указатели и члены с плавающей запятой, даже если реализацияне использует все нулевые биты как представления для нулевых указателей и нулей с плавающей запятой.

3 голосов
/ 24 июня 2011

memset может работать на вашей платформе, но на самом деле это не рекомендуемый (переносной) подход ...

Это:

struct timeval myTime;

myTime = (struct timeval){ 0 };

memset работаетпотому что все элементы struct timeval имеют нулевые значения, которые представлены битовой комбинацией из всех нулей на вашей платформе.

Но это не требуется спецификацией.В частности, POSIX не требует, чтобы тип time_t был целым числом, а C не требует, чтобы ноль с плавающей точкой представлялся байтами со всеми нулями.

Использование синтаксиса инициализатора гарантирует поля полейСтруктура будет должным образом установлена ​​на ноль, будь то целое, с плавающей запятой, указатели или другие структуры ... Даже если представление этих вещей не все-ноль в памяти.То же самое не верно для memset в целом.

1 голос
/ 24 июня 2011

Предполагая, что вы хотите, чтобы структура 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.

0 голосов
/ 24 июня 2011

Если вы ищете однострочник, я думаю, вы могли бы также использовать memset для работы:

0 голосов
/ 24 июня 2011

Вы можете использовать memset, тогда вы также обнуляете любых членов, специфичных для платформы.

...