2013-06-26 4 views
4

Я пытаюсь определить статическую структуру и инициализировать ее значения один раз, когда она объявлена, но я не совсем уверен, как это сделать.Статическая декларация структуры

Я звоню функцию в цикле, и я хочу, чтобы инициализировать timespec (в частности значение tv_sec) а в 0 (то значение по умолчанию) в первый раз, когда вызывается функция, но никогда.

Я знаю, что могу сделать это с целыми числами и другими простыми типами данных, выполнив: static int foo = 0

Но я хочу сделать то же самое с со структурой, поэтому его не так просто.

По существу, я хочу сделать это: static struct timespec ts.tv_sec = 0; Но это незаконно, поэтому мне нужно знать юридическую форму (если она существует).

Помощь?

+0

Структуры могут быть инициализированы с помощью '{...}', это то, что вы имеете в виду? – Matt

+0

@Matt, который может сработать ... – Nealon

+0

@Matt да, это, спасибо, положите его в ответ, и я дам вам кредит – Nealon

ответ

7

Совокупные объекты, такие как структуры или массивы, инициализируются с помощью инициализаторов = { ... }. Вы можете Инициализаторы питания для последовательных членов структуры, начиная с первого, или использовать C99 помечено подход

static struct timespec ts = { .tv_sec = 0 }; 

Примечание Кстати, что = { ... } подход является более универсальным, чем это может показаться на первый взгляд. Скалярные объекты также могут быть инициализированы с такими инициализаторами

static int foo = { 0 }; 

Также отметит, что = { 0 } будет обнулять все поля данных в агрегированном объекте, а не только первый.

Наконец, имейте в виду, что объекты со статической продолжительностью хранения всегда нулевой инициализируется автоматически, а это означает, что если вы просто объявить

static struct timespec ts; 

вы уже гарантированно закончить с нулевой инициализируется объект. Нет необходимости делать это явно.

1

Статический объект, независимо от того, является ли он структурой, объединением, массивом или базовым типом, всегда инициализируется нулем при отсутствии явного инициализатора. Просто используйте

static struct timespec foo; 
0

Вместо инициализации с "недопустимым" значением, вы можете просто использовать другое переменный:

static struct timespec ts; 
static int ts_initialized = 0; 

if (!ts_initialized) { 
    init_ts(&ts); 
    ts_initialized = 1; 
} 

Преимущество:
1. Несколько более ясно.
2. Не нужно находить «магическое» значение, которое никогда не будет использоваться.