繁体   English   中英

在 C90 中使用 snprintf

[英]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>的解决方案。

不。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM