2016-11-12 4 views
0

내 코드에서 일종의 컴파일러/링커 오류가 발생합니다. 대부분 전처리 기 관련이 있습니다. 오류 메시지는 "x의 다중 정의"를 읽습니다. 여기서 x는 lib.c 파일에있는 4 개의 함수 중 하나입니다. 내가 사용하고있는 컴파일러/링커는 GNU GCC 컴파일러가 코드와 함께 패키지되어있다 : 블록여러 정의 ... (링커 오류?)

#includes의 순서를 변경하지 않으려 고 시도했는데, 이것이 내가 링커 오류라고 생각하게 만든다. 컴파일러 오류는 의도적 인 구문 오류를 만들면 컴파일러가 오류 메시지를 표시하지 않고 중단하고 중단한다는 사실입니다.

모든 도움/조언/비평, 감사드립니다!

#include <stdlib.h> 
#include "lib.c" 

int main() 
{ 
getGradeAverage(); 
return EXIT_SUCCESS; 
} 

과 lib.c :

#include "defs.h" 

void getUserName() 
{ 
printf ("please enter the your name:"); 
studentRecord sr; 
scanf("%40[^\n]%*c",&sr.studentName); 
} 

void getCourse (index) 
{ 
printf("please enter the name of course 1:"); 
courseRecord cr1; 
scanf("%40[^\n]%*c",&cr1.courseName); 
do{ 
    printf("please enter a grade for course 1:"); 
     if ((scanf("%i",&cr1.grade))>-2) 
     { 
      printf("the grade you entered is not on the scale. please try again:"); 
      fflush(stdin); 
      continue; 
     } 
    } while(true); 
printf("please enter the name of course 2:"); 
courseRecord cr2; 
scanf("%40[^\n]%*c",&cr2.courseName); 
    do{ 
    printf("please enter a grade for course 1:"); 
     if ((scanf("%i",&cr2.grade))>-2) 
     { 
      printf("the grade you entered is not on the scale. please try again:"); 
      fflush(stdin); 
      continue; 
     } 
    } while(true); 

} 

void GPAPrint() 
{ 
    int GPA; 
    studentRecord sr; 
    courseRecord cr1; 
    courseRecord cr2; 
    printf("Student name: %s\n",&sr.studentName); 

} 

void getGradeAverage() 
{ 
    int index=1; 
    getUserName(); 
    getCourse(index); 
    GPAPrint(); 
    return (0); 

} 

defs.h 파일이 #include를 대부분 들어 있으므로, 여기에도 관련이 여기

은 main.c에 파일입니다 및 구조체.

#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 
#include <math.h> 
#include <string.h> 
#define MAX_LENGTH 40 

typedef struct courseRecord 
{ 
char courseName [MAX_LENGTH+1]; 
int grade; 
}courseRecord; 

typedef struct studentRecord 
{ 
char studentName [MAX_LENGTH+1]; 
char courseName[2]; 
}studentRecord; 
+0

정확히 "내 코드에서 일종의 컴파일러/링커 오류"가 무엇입니까? BTW 헤더 파일에 4 개의 함수에 대한 함수 프로토 타입을 넣어야합니다. –

+0

아래로 더 자세히 지정했습니다. 오류 메시지는 "multiple definitions of ..."입니다. 아니면 다른 것을 의미합니까? – Thefoilist

+0

'x' 중. 'x' 무엇입니까? –

답변

1

아마, 당신은 main.c 그것을 보내고 빌드에서 lib.c뿐만 아니라 #include을 포함했다. 이로 인해 컴파일 된 오브젝트 (예 : lib.omain.o)가 각각 함수 정의를 갖게됩니다. 링커는 이것을 선택합니다 (모든 객체 파일을 검사하기 때문에 컴파일러는 한 번에 하나씩 생성하므로 두 개 이상의 객체 파일이 여러 번 정의하는 인스턴스를 감지 할 수 없으며 여러 정의에 대해 불평합니다).

지침으로는 결코 #include.c 파일이 아닙니다.

대신 헤더 파일에 함수를 대신 선언 (일명 프로토 타입) (lib.h 말)

#ifndef LIB_H_INCLUDED 
#define LIB_H_INCLUDED 

#include "defs.h" 

void getUserName(); 
void getCourse (index); 

    // etc 

#endif 

#include 그 기능을 사용할 필요가 모든 .c 파일입니다. 이것은 컴파일러가 함수를 올바르게 호출하는지 확인할 수 있도록 충분한 정보를 제공합니다. 그런 다음 함수 정의 (일명 구현체)를 lib.c에 배치합니다. lib.c#include "lib.h"이 필요하므로 컴파일러는 헤더에서 함수의 선언이 정의와 일치하는지 확인할 수 있습니다.

또한 헤더에 포함 된 가드를 배치했습니다. 그 이유를 알아 내기 위해 Google에 당신을위한 운동으로 남겨 두겠습니다.

+0

감사합니다! 나는 같은 형식을 사용하여 defs.h의 바닥에 프로토 타입을 넣을 수 있습니까? 경비원은 아직 어떤 생각인지 모르겠지만 약간의 연구를 할 것입니다. – Thefoilist

+0

수 있습니다. 모든 전 처리기는 텍스트 대체입니다. 좋은 생각인지 아닌지는 프로젝트 요구 사항에 달려 있습니다. – Peter

+0

그것은 작동합니다! (악마 과학자가 최선의 효과를 발휘한다고 말하면서). 시간 내 줘서 고마워! – Thefoilist