C Инициализация структуры: странный способ - PullRequest
2 голосов
/ 25 марта 2010

При чтении кода, с которым я столкнулся, следующее определение и инициализация структуры:

// header file
struct foo{
char* name;
int value;
};

//Implementation file
struct foo fooElmnt __foo;
// some code using fooElmnt
struct foo fooElmnt __foo = {
    .name = "NAME";
    .value = some_value;
}

Что это означает в C и чем оно отличается от обычных объявлений?

Ответы [ 3 ]

6 голосов
/ 25 марта 2010

Это называется обозначенная инициализация ,

В инициализаторе структуры укажите имя поля для инициализации .fieldname = перед элементом значение. Например, учитывая следующая структура,

 struct point { int x, y; };

следующая инициализация

 struct point p = { .y = yvalue, .x = xvalue };

эквивалентно

 struct point p = { xvalue, yvalue };

Если вы читаете дальше, это объясняет, что .fieldname называется обозначением .

ОБНОВЛЕНИЕ: Я не эксперт C99, но я не смог скомпилировать код. Вот изменения, которые я должен был сделать:

// header file
struct foo{
char* name;
int value;
};

//Implementation file
//struct foo fooElmnt __foo;
// some code using fooElmnt
struct foo fooElmnt  = {
    .name = "NAME",
    .value = 123
};

Удалось ли вам скомпилировать это? Я использовал TCC .

3 голосов
/ 25 марта 2010

Это назначенная инициализация. Это также инициализирует поля по их именам, что более удобно для чтения, чем анонимная инициализация, когда структуры становятся большими. Это было введено стандартом C99.

3 голосов
/ 25 марта 2010

Это обозначенные инициализаторы, введенные в c99. Вы можете прочитать больше здесь

Без них вы бы использовали

struct foo fooElmnt __foo = {
    "NAME",
    some_value
};

Хотя в этом случае это не имеет большого значения - кроме того, что путь c99 более многословен, и его легче прочитать, какой элемент инициализирован для чего.

Это действительно помогает, если в вашей структуре много членов, и вам нужно только инициализировать несколько из них чем-то отличным от нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...