【发布时间】:2021-12-14 21:47:54
【问题描述】:
有没有办法指示编译器:
- 语言是 C90
- stdio.h 的声明是 C99(包括 snprintf)的声明
使用cc -std=c90 -Wall(在使用 snprintf 的源文件上)会发出烦人的警告(有时,取决于编译器/环境,会出现令人困惑的提示,即应该包含 stdio.h,即使它已经包含在内),但是链接器还是找到了 snprintf 。我明白发生了什么,这不是问题。
使用 strict c90(语言)和 snprintf(库函数)在技术上是可行的,但我不知道如何相应地指导编译器。换句话说,我想区分语言合规性和图书馆合规性。
备注:我假设 C99 stdio.h 头文件中使用的语言实际上是 C90,因此它可以包含在 C90 源文件中。有什么能阻止它吗?
为了可移植性,我更喜欢使用通用 include <stdio.h> 的解决方案。
【问题讨论】:
-
我不知道 C89 和 C99 之间发生的所有变化,但 C99-stdio.h 甚至会是与 C89 兼容的语言吗?
-
问:是否有一些神奇的编译器开关可以强制您的“用户代码”符合 C90,但您包含的标头符合 C99?答:不存在,也不可能。问:C99 版本的“stdio.h”会以某种方式违反 C90 合规性吗?答:不会。 问:为符合 C90 标准而编译的“用户代码”是否会与 C99 版本的 C 运行时库不兼容?答:不会。 问:用旧的 C90 编译器编译的“用户代码”是否会与 C99 版本的 C 运行时库不兼容? A:我怀疑,但有可能……
-
这是否可行以及如何实现取决于您的实施,因此我无法给出正确答案。但是,请查看“功能选择宏”和/或“功能测试宏”的文档。
-
@StephenNewell C99-stdio.h 可以很好地用 C90 和 C99 的通用集合编写,也就是说,直到旧的构造(例如隐式 int),都非常接近 C90。 C99本质上是C90的扩展,我猜C99标准库的很多功能都不需要扩展。
标签: c header-files c99 stdio c89