具有不同类型的外部结构

structure extern with different type

我在映射文件中发现以下警告,file2.c 声明中的 struct extern 声明类型已更改。在 IAR 编译器的警告之下, 请让我知道以下类型转换的影响。 file2.c 而 link 时间的内存大小是多少?

我试图找到此实施的影响而不是解决方案

"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)

谢谢 达莫达兰

在 file2.c 中,Block_01 被赋予类型 unsigned char,其大小为 1 个字节。这将访问结构 Block_01_t 的第一个字节,它将成为 Block_01_T.Data_01.

的一部分

您有两个同名变量。 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

链接器通常不关心对象的大小,只关心它们的地址。编译器在定义对象的对象文件中保留space。在这种情况下,定义在File1.c中,它声明了一个包含两个uint16的结构,因此它最多会保留至少4个字节。

根据 C 标准,在 File2. 中使用 Block_01 时的后果是不确定的。但我认为这很可能相当于给它相同的结构类型声明,然后使用 *(char *)(&Block_01).