[英]Using snprintf with C90
有没有办法指示编译器:
使用cc -std=c90 -Wall
(在使用 snprintf 的源文件上),会发出令人讨厌的警告(有时,取决于编译器/环境,带有令人困惑的提示,即应包含 stdio.h,即使它已经包含) ,但链接器无论如何都会找到 snprintf 。 我明白发生了什么,这不是问题。
使用严格的 c90(语言)和 snprintf(库函数)在技术上是可行的,但我不知道如何相应地指示编译器。 换句话说,我想区分语言合规性和库合规性。
备注:我假设 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或其他版本的标准库测试过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.