我在映射文件中发现了以下警告,结构外部声明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
在file2.c中,Block_01
的类型为unsigned char
,大小为1字节。这将访问结构Block_01_t
的第一个字节,它将是Block_01_T.Data_01
的一部分。
您有两个同名的变量。CCD_ 5和不同类型。这是不允许的。你需要改变其中一个。
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标准,当您在File2.
中使用Block_01
时,后果是未定义的。但我认为这可能相当于给它一个相同的结构类型声明,然后使用*(char *)(&Block_01)
。