структура внешняя с разным типом - PullRequest
0 голосов
/ 13 ноября 2018

Я обнаружил следующее предупреждение в файле карты, объявление 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)

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

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

У вас есть две переменные с одинаковым именем.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
0 голосов
/ 13 ноября 2018

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

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

0 голосов
/ 13 ноября 2018

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

...