gpt4 book ai didi

Clang 无法编译 c11 程序,引用 "implicit declaration is illegal in c99"

转载 作者:太空狗 更新时间:2023-10-29 15:32:31 24 4
gpt4 key购买 nike

我写了这个简单的小程序来演示我的问题(标题为 hello.c)(旁注:我注意到这个程序中的内存泄漏,但这只是一个例子,所以它并不重要):

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv) {
char * buf = NULL;
size_t buflen = 0;

ssize_t line_len;

while ((line_len = getline(&buf, &buflen, stdin)) > 0) {
buf[line_len - 1] = '\0';

char * val = getenv(buf);

if (val) {
printf("setenv %s \"%s\"\n", buf, val);
}
else {
fprintf(stderr, "warning: %s not found\n", buf);
}
}

return EXIT_SUCCESS;
}

这在 Linux 下编译良好,使用 gcc 和 gnu make 以及以下 makefile:

CFLAGS += -std=c11 -Wall -Werror -Wpedantic
CPPFLAGS := -D_XOPEN_SOURCE=700

EXES := hello

all: $(EXES)

clean:
rm -f $(EXES) *.o

但是,在 BSD 下,使用 clang 和 bmake,我无法编译(使用完全相同的 makefile 和源文件),因为它说

hello.c:11:24: error: implicit declaration of function 'getline' is invalid in
C99 [-Werror,-Wimplicit-function-declaration]

问题是,如您所见,我不是在 c99 模式下编译,而是在 c11 下编译,而且,根据定义 _POSIX_C_SOURCE 的手册页,为 200809 或更高应该启用 getline,我确信在其他地方将 _XOPEN_SOURCE 定义为 700 应该可以实现这一点。

去掉 -W 标志没有帮助。

那么,我做错了什么?我怎样才能让它编译?我很难过。

最佳答案

您已经设置了 -std=c11 -Wpedantic,这意味着普通定义不可用并且不会声明 POSIX 函数,除非您显式设置 _POSIX_C_SOURCE_XOPEN_SOURCE。在第一个 #include 之前添加 #define _XOPEN_SOURCE 700(在 Linux 上甚至是 800),一切都会好起来的。

makefile 中有 CPPFLAGS = -D_XOPEN_SOURCE=700CPPFLAGS 实际上显示在 GCC 命令行上吗?

我经常在 Mac OS X 10.10.1 上使用 -std=c11 进行编译,并且我有一个将 _XOPEN_SOURCE 设置为 700 的 header 。但是,我可以接受您的代码并逐字编译:

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition -Werror -pedantic -c yourprog.c

唯一的提示是既没有使用argc也没有使用argv(所以编译确实失败了,但不是因为getline() ).

请注意,CPPFLAGS 不一定能被 BSD make 识别。没有要求识别 CPPFLAGS 的通用标准。

关于Clang 无法编译 c11 程序,引用 "implicit declaration is illegal in c99",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com