getline
GNU C 라이브러리에 있는 동일한 이름의 함수와 충돌하는 C++라는 함수를 정의하고 사용하는 오래된 C 프로그램을 GCC를 통해 컴파일하려고 합니다 . 어떻게 컴파일할 수 있나요? GCC로 전달하면 -ansi -D_XOPEN_SOURCE_EXTENDED
이상한 오류가 발생합니다 strings.h
.
/usr/include/strings.h:74:16: error: expected identifier or '(' before '__extension__'
관련 줄은 다음과 strings.h
같습니다.
extern char *index (__const char *__s, int __c)
__THROW __attribute_pure__ __nonnull ((1));
답변1
이 -fno-builtin-function
옵션은 및 gcc
같은 내장 함수에 사용할 수 있지만 (참조malloc
strlen
GCC에서 제공하는 기타 내장 기능glibc
), 함수 와 같은 내장 GNU 확장 에서는 작동하지 않습니다 getline
.
jw013의 링크에서 지적한 일부 솔루션과 유사하게 #define
소스 파일에 명령문을 삽입하여 getline
프로그램 정의 함수의 이름을 바꿀 수 있습니다 #define getline my_getline
.
다음은 이 접근 방식을 보여주는 작은 코드 예제입니다.
/*
gcc -Wall -Wextra -o mystrdup mystrdup.c
./mystrdup
*/
#include <stdio.h>
#include <string.h>
// mystrdup.c:14: error: conflicting types for 'strdup'
//#define strdup my_strdup
char *strdup(char *str) {
str = str;
return str;
}
int main (void) {
char *str = 0;
char mystr[] = "Hello, mystrdup!";
str = strdup(mystr);
printf("%s\n", str);
return 0;
}
답변2
노력하다:
gcc -fno-builtin-getline ...
자세한 내용은 다음을 참조하세요.
man gcc | less -p '-fno-builtin'
답변3
GCC 문서에서 이 문제를 해결하기 위한 제안은 -ansi 컴파일러 스위치를 추가하는 것입니다. 왜냐하면 getline은 ansi에 대한 GCC 확장이기 때문입니다.