在 C90 中使用 snprintf

Using snprintf with C90

有没有办法指示编译器:

使用 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或其他版本的标准库。