c - Using snprintf with C90



是否有办法指示编译器:

  • 语言为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, ... );

相关内容

  • 没有找到相关文章

最新更新