编译时检查 stdint.h 是否存在
我正在使用旧版嵌入式 C 代码,该代码使用 typedef
关键字在头文件中定义类型 uint8_t、uint16_t
和 uint32_t
。
为了便于讨论,我们假设文件 typedefs.h
包含这些定义。
在我的新 C 源模块中,我包含了 stdint.h
。我还包括其他头文件,其中在层次结构中的某个位置包含 typedefs.h
。正如预期的那样,编译器抱怨多个定义的符号。
我想修改旧文件 typedefs.h
,以便在未包含 stdint.h
时仅声明 uint*_t
类型如果未定义 uint*_t
类型,则更好。
我的理解是,由于 typedef
不是预处理器指令,因此无法使用 #ifndef
。
那么,如果 uint*_t
已经存在(或者 stdint.h
已经包含),我该如何告诉编译器不要定义它们呢?
注意:如果 C 规范定义的标准包括头文件的保护定义,这会很容易。
FWIW,我正在为 ARM9 处理器使用 Green Hills 编译器 4.24。
I'm working with legacy embedded C code which defines the types uint8_t, uint16_t
and uint32_t
in a header file using the typedef
keyword.
For discussion, let us say the file typedefs.h
contains these definitions.
In my new C source module, I include stdint.h
. I also include other header files which include typedefs.h
somewhere in the hierarchy. As expected, the compiler complains about multiple defined symbols.
I would like to modify the legacy file typedefs.h
so that it only declares the uint*_t
types if either stdint.h
is not included or better if the uint*_t
types are not defined.
My understanding is that #ifndef
cannot be used since typedef
is not a preprocessor directive.
So how do I tell the compiler to not define the uint*_t
if they already exist (or if the stdint.h
is already included)?
Note: this would be easy if the C specification defined standard include guard definitions for the header files.
FWIW, I am using Green Hills compiler, 4.24, for an ARM9 processor.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我相信 stdint.h 还应该为其定义的类型的限制定义一个宏。您应该能够使用
#ifdef
等来测试那些。编辑:最初使用 UINT32_MIN,但正如 Jens Gustedt 指出的那样,这是有符号/无符号和最小/最大的一种组合,不会发生。
I beleive that the
stdint.h
should also be defining a macro for the limits of the types that it defines. You should be able to test for those using a#ifdef
and the like.Edit: Originally used UINT32_MIN, but as Jens Gustedt poited out this is the one combination of signed/unsigned and min/max that doesn't occur.
只需修复旧标头以始终包含
stdint.h
即可获取这些类型,删除重复的定义,并为缺少这些类型的损坏系统提供一个嵌入式文件stdint.h
它。Just fix the legacy header to always include
stdint.h
to get these types, remove the duplicate definitions, and provide a drop-in filestdint.h
for broken systems that lack it.如果您使用的是 UNIX 系统,那么您应该备份一个步骤并使用 autoconf(1) 或 automake(1) 等配置包。它旨在处理此类问题。
If you're on a UNIX system, then you should back-up a step and use a configuration package like autoconf(1) or automake(1). It's designed to handle problems like this.