2016-05-11 2 views
-1

У меня есть структура с несколькими членами внутри нее, которые я, похоже, не могу определить после объявления ее в отдельной инструкции. Для простоты предположим, что она выглядит следующим образомНедопустимое переопределение «(идентификатор структуры)»

typedef struct 
{ 
int number; 
int anotherNumber; 
char character; 
char anotherCharacter; 
} MY_STRUCTURE_t; 

Похоже, я должен быть в состоянии объявить структуру и определить его в дальнейшем, так как я хотел бы сделать с переменной более простого типа. Например,

MY_STRUCTURE_t my_structure; 

my_structure = { 
.number = 1, 
.anotherNumber = 42, 
.character = '\0', 
.anotherCharacter = 'a' 
}; 

Код выше генерирует ошибку: "Invalid переопределение "my_structure"". Достаточно справедливо, компилятор знает лучше. С другой стороны, следующий код работает нормально.

MY_STRUCTURE_t my_structure = { 
.number = 1, 
.anotherNumber = 42, 
.character = '\0', 
.anotherCharacter = 'a' 
}; 

В чем проблема с фрагментом посередине? Есть ли фундаментальный недостаток, который мне не хватает?

+0

Посмотрите определение и декларацию. См. Этот [вопрос] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration) – t0mm13b

+0

RHS этого назначения является инициализатором. По определению инициализатор может использоваться только для установки переменной в той точке, в которой она определена. Синтаксис инициализатора недействителен для последующих операций присваивания. – kaylum

+0

К сожалению, этот код может использоваться только для объявлений. Он не создан для назначения новых значений членам структуры. Вместо этого вам придется называть отдельных членов. – Striker

ответ

2

Эта линия:

MY_STRUCTURE_t my_structure; 

это определение. Вы говорите «объявляете это сейчас и определяете его позже», но на самом деле то, что вы описываете, - это «определить его сейчас и назначить новое значение позже». Это то же самое для примитивных типов.

В C назначение (не инициализация) не может быть выполнено непосредственно из списка, заключенного в фигурные скобки. Но вы можете (при объеме блока, конечно) назначить из составного литерала:

my_structure = (const MY_STRUCTURE_t){ 
    .number = 1, 
    .anotherNumber = 42, 
    .character = '\0', 
    .anotherCharacter = 'a' 
}; 
+0

Спасибо за ваш ответ! Являются ли сложные литералы тем, что вы часто видели/использовали на практике? Особенно в контексте встроенных систем? – agromov

+0

иногда разработчики встроенных систем не понимают, что это не 80-е годы –

Смежные вопросы