是否有办法指示编译器:
- 语言为C90
- stdio.h的声明为C99(包括snprintf)
对于cc -std=c90 -Wall
(在使用snprintf的源文件上),会发出一个恼人的警告(有时,根据编译器/环境,会发出一个令人困惑的提示,即应该包含stdio.h,即使它已经包含了),但链接器还是会找到snprintf。我明白发生了什么事,那不是问题。
使用严格的c90(语言)和snprintf(库函数)在技术上是可能的,但我不知道如何指示编译器。换句话说,我想区分语言遵从性和库遵从性。
备注:我假设C99 stdio.h头文件中使用的语言实际上是C90,因此它可以包含在C90源文件中。有什么可以预防吗?
出于可移植性的考虑,我更倾向于使用通用include <stdio.h>
的解决方案。
可以,尽管这样做有点奇怪。
你可以定义_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或其他版本的标准库。
No.
C90编译器的通用#include <stdio.h>
不需要声明snprintf
。
在你争辩说它不是C90编译器之前,请记住,你正在请求它作为一个使用-std=c90
的编译器。作为C90编译器的编译器不需要做任何C90编译器不会做的事情。
因此没有通用的解决方案。
可能有特定于编译器的解决方案,包括添加以下内容:
int snprintf( char * buffer, size_t bufsz, const char * format, ... );