在我的.c文件中包含两个外部头文件会导致unit32的typedef冲突,因为该类型在两个文件中的定义不同(第一个typedef unsigned long
和第二个typedef unsigned int
) 。该代码适用于32位微控制器。
什么是在不更改外部文件中的代码的情况下解决此类问题的最佳方法?我在谷歌做了很多研究,但我找不到解决方案。我找到了以下帖子:C typedef name conflict。
我试过这种方式,但它没有用。 Sinsce我也不明白这个解决方案是如何运作的,因为我在代码中犯了错误。有人能举例说明如何实现它吗?
感谢
答案 0 :(得分:1)
由于两个定义都描述了一个32位unsigned int
(例如通过调用它uint32
),它的假定代表4字节unsigned int
,无论哪种方式它是定义的。您应该检查特定编译器中的sizeof(int)
和sizeof(long)
。
对于32位业余爱好者的微控制器,可能会出现以下情况:
sizeof(long) == sizeof(int)
假设两个typedefs
都定义了无符号的4字节int
,则使用中没有实际差异。
如果它们的大小不同,则其中一个typedef被错误地命名为uint32
,并且应根据大小命名为uint16
或uint64
对于编译器中的那种类型。
但是,如果更改typedef
名称以使其更准确,则必须找到使用typedef的任何其他代码,并根据所需的存储大小使用正确的typedef。
由于它是微控制器的编译器,因此可能没有一个包含任何文件的软件堆栈,所以你可能没问题。例如。只有您编写的代码很重要,但如果有其他软件包含代码,请检查并相应更新。
如果某些代码包含一个标题但不包含另一个标题,则需要确保在包含.h
的任何标题中定义它,但为了确保uint32
类型仅定义一次,可以使用C预编译器添加“保护”以防止多个包含(以及随之发生的编译时冲突错误),如下所示:
在一个.h文件中:
#ifndef _UINT32
typedef unsigned long uint32
#define _UINT32
#endif
另一方面:
#ifndef _UINT32
typedef unsigned int uint32
#define _UINT32
#endif