我正在使用遗留的嵌入式C代码,它使用uint8_t, uint16_t关键字在头文件中定义uint32_t和typedef类型。
为了便于讨论,让我们假设文件typedefs.h包含这些定义。
在我的新C源模块中,我包括了stdint.h。我还包括其他头文件,这些文件包括层次结构中的某个位置的typedefs.h。正如预期的那样,编译器会抱怨多个定义的符号。
我想修改遗留文件typedefs.h,以便它只在没有包含stdint.h的情况下声明uint*_t类型,如果没有定义uint*_t类型则更好。
我的理解是,由于#ifndef不是预处理器指令,所以不能使用typedef。
那么,如果uint*_t已经存在(或者stdint.h已经包含了),我如何告诉编译器不要定义它们?
注意:如果C规范定义的标准包括头文件的保护定义,这将很容易。
FWIW,我使用绿山编译器,4.24,作为一个ARM9处理器。
发布于 2010-09-07 18:43:17
只需将遗留头修复为始终包括stdint.h,以获取这些类型,删除重复的定义,并为缺少这些类型的损坏系统提供一个插入文件stdint.h。
发布于 2010-09-07 18:45:58
我认为stdint.h也应该为它定义的类型的限制定义一个宏。您应该能够测试那些使用#ifdef等。
#ifndef UINT32_MAX
typdef ... uint32_t;
#define UINT32_MAX ...
...
#endif编辑:最初使用的是UINT32_MIN,但正如Jens指出的那样,这是一个没有签名/未签名和min/max的组合。
发布于 2010-09-07 20:21:08
如果您在UNIX系统上,那么您应该备份一个步骤,并使用像autoconf(1)或automake(1)这样的配置包。它被设计用来处理像这样的问题。
https://stackoverflow.com/questions/3661576
复制相似问题