доступ к членам структуры с помощью sizeof - PullRequest
1 голос
/ 11 декабря 2011

У меня есть этот код, который я не понимаю, почему он не компилируется:

typedef struct 
{
  uint32_t serial_number;
  uint32_t ieee_address[6];
} FACTORY_CONFIG; 

...
// Unlock flash (only the portion we write on)
    error = FLASHD_Unlock ( writeaddress, writeaddress + sizeof ( FACTORY_CONFIG.serial_number ), 0, 0 );

Когда я запускаю его, я получаю эту ошибку:

Ошибка [Pe018]: ожидается ")"

Когда я изменяю

FACTORY_CONFIG.serial_number

на

FACTORY_CONFIG

, компилируется и все работает.Я не уверен, могу ли я проверить размер шрифта внутри структуры?

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

Вы не можете просто получить доступ к членам типов в C, как это.Вы можете, однако, взять sizeof от реальных объектов.А поскольку sizeof является конструкцией во время компиляции, эти объекты даже не должны быть допустимыми.Таким образом, будет работать следующее:

sizeof(((FACTORY_CONFIG *)0)->serial_number)

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

0 голосов
/ 11 декабря 2011

То, что вы, похоже, хотите, - это интерпретировать ваш writeaddress, как если бы он указывал на объект вашего struct, а затем получить доступ к адресу ieee_address члена.

Способ, которымвсе, что нужно сделать в C:

((FACTORY_CONFIG*)writeaddress)->ieee_address

, вот и все.

Метод, который вы использовали, очень опасен, потому что вы не знаете, как ваш компилятор будет размещать structв памяти.Если вам нужно, есть макрос offsetof для получения точного положения поля.

Кстати, наличие псевдонима типа во всех заглавных буквах противоречит общему стилю кодирования и привычкам каждого.Обычно все заглавные буквы зарезервированы для макросов.

0 голосов
/ 11 декабря 2011

Сначала вам нужно создать объект. Структура, которую вы создаете, является только типом. Делай так:

sizeof (((FACTORY_CONFIG *)0)->serial_number)
...