K&R2 1장에서 가장 긴 줄 예제를 컴파일할 때 "etline 유형 충돌" 오류가 발생하는 이유는 무엇입니까?
여기 제가 "C 프로그래밍 언어" 섹션 1.9에서 바로 실행하려고 하는 프로그램이 있습니다.
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
main()
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0)
printf("%s", longest);
return 0;
}
int getline(char s[], int lim)
{
int c, i;
for (i=0; i<lim-1 && (c=getchar()) !=EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
다음은 Ubuntu 11.10을 사용하여 프로그램을 컴파일하려고 할 때 발생하는 오류입니다.
cc word.c -o word
word.c:4:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
word.c:26:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
make: *** [word] Error 1
책의 인쇄물에 문제가 없는지 확인하기 위해 책의 장 뒷부분 연습 문제에 대한 이 답변 세트를 참조했습니다(http://users.powernet.co.uk/eton/kandr2/krx1.html) 그리고 저는 그 링크에서 연습 18, 19, 20, 21 등을 실행하려고 할 때 비슷한 오류가 발생합니다.프로그램을 실행하여 프로그램이 어떻게 출력되는지 확인할 수 없을 때 배우는 것은 정말 어렵습니다.이 문제는 하나의 프로그램에 문자 배열과 함수 호출을 도입할 때 시작되었습니다.이 문제에 대한 조언을 해주시면 감사하겠습니다.
문제는getline()는 표준 라이브러리 함수입니다.(에 정의됨)stdio.h함수의 이름이 동일하므로 함수와 충돌합니다.
해결책은 단순히 이름을 바꾸는 것입니다.
충돌하는 함수는 GNU/POSIX 확장입니다.
K&R은 ANSIC를 그들의 책(c.f.)에서 구체적으로 다루고 있으며, 이 기능을 제공하지 않는다고 명시하고 있습니다.
저자들은 ANSI 표준 C 언어 프로그래밍에 대한 전체 가이드를 제시합니다.
gcc를 "K&R 호환성 모드"로 설정하려면 컴파일을 위한 ANSI 또는 ISO 모드를 지정할 수 있습니다.이들은 확장 기능(예: 기능)을 비활성화하기 위한 것입니다.getline()이는 결국 K&R에서 제공하는 다른 예제를 편집할 필요성을 없앨 수 있습니다.
예를 들어, 다음 컴파일은 문제가 없습니다.
$ gcc test.c -ansi
$ gcc test.c -std=c89
(의 암묵적인 기본 반환 유형에 대해 불평하는 경우 제외)main()와 함께-Wall.)
일부 시스템에서는 이러한 모드가 여기에 제시된 대로 작동하지 않을 수 있습니다(Mac OS 일부 버전에서는 모든 확장을 올바르게 비활성화하지 못합니다).나는 이것을 내 기계에서 성공적으로 테스트했습니다.
$ gcc --version
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
그 이유는stdio.h을 보다getline()기능.
따라서 이 작업을 수행하는 간단한 방법은 함수의 이름을 다음과 같이 변경하는 것입니다.my_getline()
둘다요.getline()그리고.getdelim()원래는GNU내선 번호그들은 표준화되었습니다.POSIX.1-2008.
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
힌트를 줄 겁니다.이름을 변경합니다.getline()코드에서 다른 것으로 기능합니다.
또선언니다합한을 선언합니다.main()이 방법은 오래된 스타일입니다.선언된 반환 형식과 인수가 없는 함수는 기본적으로 지정되지 않은 수의 인수를 허용하고 int를 반환합니다.은 이은거의의다니경입우것▁의 경우와 거의 같습니다.main()int를 반환하지만 두 개의 인수가 있습니다.다음과 같이 선언하는 것이 좋습니다.
int main(int argc, char **argv)
또는:
int main(int argc, char *argv[])
getline 이에선된함다수니입언제▁in에서 선언된 입니다.stdio.h
이름 getline다른 이름으로 함수를 지정하면 컴파일됩니다.
getline 이름이 이미 존재하기 때문에 변경해야 합니다.
는 이미 "stdio"에 정의된 getline이라는 함수입니다.h" 파일.따라서 프로토타입의 충돌!함수 이름을 "my_getline" 또는 다른 이름으로 변경하면 모두 정상입니다!
언급URL : https://stackoverflow.com/questions/8763052/why-do-i-get-a-conflicting-types-for-getline-error-when-compiling-the-longest
'codememo' 카테고리의 다른 글
| 아래쪽 테두리를 보십니까? (0) | 2023.06.07 |
|---|---|
| 오류: 'closure' 유형의 개체가 하위 집합 테이블이 아닙니다. (0) | 2023.06.07 |
| 현재 모듈에서 setattr()을 어떻게 호출합니까? (0) | 2023.06.07 |
| 파이썬으로 된 n그램, 4, 5, 6그램? (0) | 2023.06.07 |
| iOS 애플리케이션용 UI 레이블의 왼쪽 상단 정렬을 설정하는 방법은 무엇입니까? (0) | 2023.06.07 |