在 C90 中使用 snprintf
Using snprintf with C90
有没有办法指示编译器:
- 语言是C90
- stdio.h 的 声明 是 C99 的声明(包括 snprintf)
使用 cc -std=c90 -Wall
(在使用 snprintf 的源文件上),会发出烦人的警告(有时,取决于 compiler/environment,并带有令人困惑的提示,即应包含 stdio.h ,即使它已经是),但链接器无论如何都会找到 snprintf 。我明白发生了什么,这不是问题。
使用严格的 c90(语言)和 snprintf(库函数)在技术上是可行的,但我不知道如何相应地指示编译器。换句话说,我想区分 language compliance 和 library compliance.
备注:我假设 C99 stdio.h 头文件中使用的语言实际上是 C90,因此它可以包含在 C90 源文件中。有什么能阻止它吗?
为了便携性,我更喜欢具有通用性的解决方案 include <stdio.h>
。
没有
C90 编译器的通用 #include <stdio.h>
不需要声明 snprintf
。
在您争辩说它不是 C90 编译器之前,请记住您要求它充当一个 usng -std=c90
。作为 C90 编译器的编译器不需要做任何 C90 编译器不会做的事情。
因此没有通用的解决方案。
可能有特定于编译器的解决方案,包括添加以下内容:
int snprintf( char * buffer, size_t bufsz, const char * format, ... );
是的,尽管这样做有点奇怪。
您可以定义 _ISOC99_SOURCE
以表示您希望定义 C99 函数。
示例:
#define _ISOC99_SOURCE
#include <features.h>
#include <stdio.h>
int main() {
char buf[10];
snprintf(buf, 4, "foo");
puts(buf);
return 0;
}
这样编译:
$ gcc -std=c90 -Wall test.c
$ ./a.out
foo
这将适用于 gcc 10.3.0 和 clang 11.0.0。在库兼容性方面,只测试过glibc,没有测试过musl或其他版本的标准库。
有没有办法指示编译器:
- 语言是C90
- stdio.h 的 声明 是 C99 的声明(包括 snprintf)
使用 cc -std=c90 -Wall
(在使用 snprintf 的源文件上),会发出烦人的警告(有时,取决于 compiler/environment,并带有令人困惑的提示,即应包含 stdio.h ,即使它已经是),但链接器无论如何都会找到 snprintf 。我明白发生了什么,这不是问题。
使用严格的 c90(语言)和 snprintf(库函数)在技术上是可行的,但我不知道如何相应地指示编译器。换句话说,我想区分 language compliance 和 library compliance.
备注:我假设 C99 stdio.h 头文件中使用的语言实际上是 C90,因此它可以包含在 C90 源文件中。有什么能阻止它吗?
为了便携性,我更喜欢具有通用性的解决方案 include <stdio.h>
。
没有
C90 编译器的通用 #include <stdio.h>
不需要声明 snprintf
。
在您争辩说它不是 C90 编译器之前,请记住您要求它充当一个 usng -std=c90
。作为 C90 编译器的编译器不需要做任何 C90 编译器不会做的事情。
因此没有通用的解决方案。
可能有特定于编译器的解决方案,包括添加以下内容:
int snprintf( char * buffer, size_t bufsz, const char * format, ... );
是的,尽管这样做有点奇怪。
您可以定义 _ISOC99_SOURCE
以表示您希望定义 C99 函数。
示例:
#define _ISOC99_SOURCE
#include <features.h>
#include <stdio.h>
int main() {
char buf[10];
snprintf(buf, 4, "foo");
puts(buf);
return 0;
}
这样编译:
$ gcc -std=c90 -Wall test.c
$ ./a.out
foo
这将适用于 gcc 10.3.0 和 clang 11.0.0。在库兼容性方面,只测试过glibc,没有测试过musl或其他版本的标准库。