编译时检查 stdint.h 是否存在

发布于 2024-09-18 01:46:05 字数 693 浏览 8 评论 0原文

我正在使用旧版嵌入式 C 代码,该代码使用 typedef 关键字在头文件中定义类型 uint8_t、uint16_tuint32_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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

魄砕の薆 2024-09-25 01:46:05

我相信 stdint.h 还应该为其定义的类型的限制定义一个宏。您应该能够使用 #ifdef 等来测试那些。

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif

编辑:最初使用 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.

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif

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.

岁月流歌 2024-09-25 01:46:05

只需修复旧标头以始终包含 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 file stdint.h for broken systems that lack it.

最好是你 2024-09-25 01:46:05

如果您使用的是 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文