Я нашел предупреждение ниже в файле карты, объявление struct extern TYPE было изменено в объявлении file2.c. Ниже предупреждение от компилятора IAR, Пожалуйста, дайте мне знать, каковы последствия приведенного ниже типа. каков объем памяти в file2.c во время компоновки?
Я пытаюсь найти последствия этой реализации, а не решение
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)
Спасибо Дамодаран
«Я отлаживаю устаревший код и обнаружил этот странный код». это работает и получает адрес первого байта структуры, однако во время выполнения я не уверен, какой компоновщик связывает 4 байта или 1 байт в File2.c
Откуда вы это цитируете? Не в этом вопрос.





В 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 Да, * (RPM_BLOCK + i); i от 0 до 3 будет обращаться ко всем 4 байтам, это правильно
У вас есть две переменные с одинаковым именем. 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
«Я отлаживаю устаревший код и обнаружил этот странный код». Его рабочий код, однако я не уверен, каково влияние этого кода.
Компоновщик обычно не заботится о размере объекта, а только о его адресах. Компилятор резервирует место в объектном файле, который определяет объект. В этом случае определение находится в File1.c, который объявляет структуру, содержащую два uint16, поэтому в ней будет зарезервировано не менее 4 байтов.
Согласно стандарту C последствия использования Block_01 в File2. не определены. Но я думаю, что это будет эквивалентно объявлению того же типа структуры и последующему использованию *(char *)(&Block_01).
Приведения типа нет. У вас есть одна и та же переменная, объявленная с совершенно разными типами. Это единственный
charвFile2.c, но структура вFile1.c. Как вы ожидаете, что это сработает?