2016-11-12 10 views
0

Я получаю ошибку своего компилятора/компоновщика в моем коде, скорее всего, связан с препроцессором. сообщение об ошибке читает «несколько определений x», где x - любая из 4-х функций в файле lib.c. компилятор/компоновщик, который я использую, является компилятором GNU GCC, упакованным с кодом: blocksНесколько определений ... (ошибка компоновщика?)

Я попытался изменить порядок #includes, чтобы не было успеха, и что заставляет меня полагать, что это ошибка компоновщика, а не ошибка компилятора заключается в том, что если я сделаю преднамеренную синтаксическую ошибку, компилятор обнаружит это и прервется, не указывая сообщение об ошибке.

вся помощь/совет/критика оценены, спасибо заранее!

здесь файл main.c:

#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 также актуален здесь, так как это содержит большинство директив #includes и структур.

#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

Я указал ниже, сообщение об ошибке «несколько определений ...», или вы имеете в виду что-то еще? – Thefoilist

+0

«Х». Что такое 'x'. –

ответ

1

Предположительно, вы включили lib.c в вашей сборке, а также #include ИНГ его в main.c. Это вызывает скомпилированные объекты (скажем, lib.o и main.o), каждый из которых имеет определения функций. Компилятор выбирает это (поскольку он рассматривает все объектные файлы, тогда как компилятор создает по одному, поэтому не может обнаруживать экземпляры, в которых два или более файла объектов определяют что-то более одного раза) и жалуется на несколько определений.

В качестве ориентира, никогда #include a .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", поэтому (среди прочего) компилятор может проверить, соответствуют ли декларации функций из заголовка определениям.

Я также разместил защитные ограждения в заголовке. Я оставлю это как упражнение для вас, чтобы понять, почему.

+0

спасибо! Могу ли я также поставить прототипы в нижней части defs.h, используя тот же формат? Я понятия не имею, что еще охранники, но я сделаю некоторое исследование. – Thefoilist

+0

Вы могли бы. Весь препроцессор - это замена текста. Будь то хорошая идея или нет, зависит от ваших потребностей проекта. – Peter

+0

он работает! (скажем, в акценте злого ученого за лучший эффект). Спасибо за ваше время! – Thefoilist