내 작은 프로그램을 작성하여이 문제 (예제 : hello.c
)를 시연했습니다. (sidenote :이 프로그램에서 메모리 누수가 있음을 발견했지만 단지 예는하지 않는 것이 중요합니다 그래서) : 나는, 그 소리와 bmake를 사용하여, BSD에서,Clang이 "c99에서 암시 적 선언이 불법입니다"라는 C11 프로그램을 컴파일하지 못했습니다.
CFLAGS += -std=c11 -Wall -Werror -Wpedantic
CPPFLAGS := -D_XOPEN_SOURCE=700
EXES := hello
all: $(EXES)
clean:
rm -f $(EXES) *.o
그러나 :
#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;
}
이 GCC를 사용하여, 리눅스에서 잘 컴파일하고 GNU는 다음 메이크로 확인 컴파일 할 수 없습니다 (정확히 동일한 메이크 파일과 소스 파일)이 될 _POSIX_C_SOURCE
을 정의하는 man 페이지에 따라 또한
hello.c:11:24: error: implicit declaration of function 'getline' is invalid in
C99 [-Werror,-Wimplicit-function-declaration]
당신이 볼 수 있듯이 문제는 내가 C99 모드에서 컴파일 하지이야 것을이지만, C11 등을 말한다 때문에 200809 또는 그 이상은 getline을 가능하게해야하며, 다른 곳에서는 _XOPEN_SOURCE
을 700으로 정의하면 안심할 수 있습니다.
-W 플래그를 사용하면 도움이되지 않습니다.
그래서 내가 뭘 잘못하고 있니? 컴파일하려면 어떻게해야합니까? 나는 혼란 스럽다.
OS X에서 코드는 makefile과'make'를 사용하여 완벽하게 빌드되고 실행됩니다. 'gcc -v'에는'Apple LLVM 버전 6.0 (clang-600.0.56) (LLVM 3.5svn 기반)'이 포함되어 있습니다. 그래서 혼자서하는 문제는 아닙니다. – Tommy
"In C99"는 적어도이 경우 "In C99 또는 그 이상"을 의미합니다. 당신은 꽤 바른 나무를 짖지 않는다 :) – hobbs
cppflags가 적용되지 않는 경우가있는 것처럼 보입니다. 'cc -D_XOPEN_SOURCE = 700 ... '을 사용하여 수동으로 컴파일 할 수 있습니다. 'make '만 실행하면 작동하지 않는 것 같습니다. –