不同类型的结构外部变量

时间:2018-11-13 00:55:44

标签: c struct linker compiler-warnings

我在映射文件中发现以下警告,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)

谢谢 Damodaran

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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