C структура-к-структуре присваивания - неверные значения в целевой структуре - PullRequest
0 голосов
/ 24 января 2011

У меня есть структура ac в заголовочном файле: -

typedef struct sample
{
char *member1;
char **member2;
long *member3;
unsigned int member4;
} example;

Я объявил переменную typedef по умолчанию в том же заголовочном файле: -

const example defaultValue;

Определение defaultValue дано в cfile: -

const example defaultValue = 
{
NULL,
NULL,
NULL,
99
};

Теперь в другом файле c, если я это сделаю,

example example1 = defaultValue;

всем членам присваивается значение NULL, как и ожидалось - но "unsigned int member4" присваивается значение 0вместо 99. Это очень странно, потому что defaultValue.member4 равно 99. Может кто-нибудь объяснить, пожалуйста, это необычное поведение?Есть ли лучший способ инициализации структуры по умолчанию?

Ответы [ 2 ]

5 голосов
/ 24 января 2011

Вы хотите, чтобы ваш заголовочный файл объявлял defaultValue примерно так:

extern const example defaultValue;

чтобы у вас не возникало проблем с более чем одним определением объекта. Без спецификатора extern каждая единица перевода (включая заголовок) будет определять экземпляр defaultValue, что ведет к неопределенному поведению.

Вы хотите, чтобы все они ссылались на файл в файле .c, который вы описали в вопросе, и именно это для вас сделает спецификатор extern.

1 голос
/ 24 января 2011

Ваш пример содержит несколько ошибок (в struct отсутствует r, а определение поля структуры должно заканчиваться точкой с запятой, а не запятой).

Кроме того, если ваш defaultValue находится в другом исходном файле, вы должны объявить его как extern в заголовке.

...