GCC를 통해 getline 함수를 정의하는 C 프로그램 컴파일

GCC를 통해 getline 함수를 정의하는 C 프로그램 컴파일

getlineGNU 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같은 내장 함수에 사용할 수 있지만 (참조mallocstrlenGCC에서 제공하는 기타 내장 기능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 확장이기 때문입니다.

관련 정보