[英]Use open_memstream with c99
我试图在我的C代码中使用open_memstream
函数。 但是我似乎无法编译它。 最小的工作示例如下:
#include <stdio.h>
int main(void) {
char *buf;
size_t sz;
FILE *stream = open_memstream(&buf, &sz);
putc('A', stream);
fclose(stream);
}
我还使用以下命令编译它:
gcc -std=c99 -o test test.c
经过一些研究,我发现在包含stdio.h
之前我需要定义一个宏。 但是,以下示例代码无济于事。
#define __USE_POSIX
#define __USE_XOPEN
#include <stdio.h>
抛出以下编译器警告; 我假设第二个警告是因为第一个警告。
test.c:7:17: warning: implicit declaration of function ‘open_memstream’ [-Wimplicit-function-declaration]
FILE *stream = open_memstream(&buf, &sz);
^
test.c:7:17: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
__USE_*
宏是glibc头文件的内部,自己定义它们不起作用。 您应该改为执行以下操作之一:
使用-std=gnu11
而不是-std=c99
编译程序,并且不要定义任何特殊的宏。 这是最简单的改变。 方便地, -std=gnu11
是较新版本的GCC的默认值。
如果您有一些具体的理由想要选择旧的,严格的一致性模式,但是您希望POSIX扩展到C,那么您可以使用记录的 POSIX功能选择宏:
#define _XOPEN_SOURCE 700
要么
#define _POSIX_C_SOURCE 200809L
必须在包含任何标准标头之前定义它们。 不同之处在于_XOPEN_SOURCE
请求一组额外的功能(“XSI”功能)。 有关更多详细信息,请参阅glibc手册的“ 功能测试宏”部分。
请注意,如果您需要从库中请求严格的一致性模式,使用-std=cXX
选项,那么您几乎肯定也想使用-Wall
和-Wpedantic
选项来启用对该语言的严格一致性检查。 (你至少应该使用-Wall
即使你并不需要严格的一致性检查。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.