Структура extern с другим типом

Я нашел предупреждение ниже в файле карты, объявление struct extern TYPE было изменено в объявлении file2.c. Ниже предупреждение от компилятора IAR, Пожалуйста, дайте мне знать, каковы последствия приведенного ниже типа. каков объем памяти в file2.c во время компоновки?

Я пытаюсь найти последствия этой реализации, а не решение

от "struct_tag" до "uint8"

Warning[w6]: Type conflict for external/entry "Block_01", in module file2.c against external/entry in module file1.c; different basic types  
  /* In module file2.c: */
  uint8 NvM_Block_01;
    typedef unsigned char uint8;
  /* In module file1.c: */
  Block_01_T Block_01;
typedef struct Block_01_Tag Block_01_T;

typedef struct Block_01_Tag

{/* 4 bytes with CRC16 */

  uint16  Data_01;
  uint16  Crc_01;
}Block_01_T;

File1.c

Block_01_T Block_01 = {1234,1};

File2.c

extern unsigned char Block_01;
#define RPM_BLOCK (&Block_01)

Спасибо Дамодаран

Приведения типа нет. У вас есть одна и та же переменная, объявленная с совершенно разными типами. Это единственный char в File2.c, но структура в File1.c. Как вы ожидаете, что это сработает?

Barmar 13.11.2018 02:29

«Я отлаживаю устаревший код и обнаружил этот странный код». это работает и получает адрес первого байта структуры, однако во время выполнения я не уверен, какой компоновщик связывает 4 байта или 1 байт в File2.c

Damodaran 13.11.2018 15:52

Откуда вы это цитируете? Не в этом вопрос.

Barmar 13.11.2018 16:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
122
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В file2.c для Block_01 задан тип unsigned char размером 1 байт. Это будет обращаться к первому байту структуры Block_01_t, которая будет частью Block_01_T.Data_01.

* (RPM_BLOCK + i); i от 0 до 3 будет обращаться ко всем 4 байтам?, в файле file2.c какой размер линковщика ссылки или размер нечего делать при выполнении в file2.c?, «Я отлаживаю устаревший код и обнаружил этот странный код. "

Damodaran 13.11.2018 15:50

@Damodaran Да, * (RPM_BLOCK + i); i от 0 до 3 будет обращаться ко всем 4 байтам, это правильно

Robert Newton 14.11.2018 00:17

У вас есть две переменные с одинаковым именем. Block_01 и разные типы. Это не разрешено. Вам нужно изменить один из них.

Block_01_T Block_01 = {1234,1};   // in File1.c
extern unsigned char Block_01;    // in File2.c

Если вы хотите, чтобы оба файла ссылались на одну и ту же переменную, вы можете использовать.

extern Block_01_T Block_01;  // in File2.c

«Я отлаживаю устаревший код и обнаружил этот странный код». Его рабочий код, однако я не уверен, каково влияние этого кода.

Damodaran 13.11.2018 15:54

Компоновщик обычно не заботится о размере объекта, а только о его адресах. Компилятор резервирует место в объектном файле, который определяет объект. В этом случае определение находится в File1.c, который объявляет структуру, содержащую два uint16, поэтому в ней будет зарезервировано не менее 4 байтов.

Согласно стандарту C последствия использования Block_01 в File2. не определены. Но я думаю, что это будет эквивалентно объявлению того же типа структуры и последующему использованию *(char *)(&Block_01).

Другие вопросы по теме