2013-03-01 5 views
0

main.c:Переопределение Проблема с помощью Makefile

#include <stdio.h> 
#include "proto.h" 

int main(void) 
{ 

    return(0); 
} // end main 

support.c:

#include "proto.h" 

\\ only function defintions 

proto.h:

#ifndef proto 
#define proto 
double PI = 3.14159; 
int LOOP_LIMIT = 90; 

#endif 

Makefile:

main: main.o support.o 
    gcc -lm -o main main.o support.o 
main.o: main.c proto.h 
    gcc -c main.c 
support.o: support.c proto.h 
    gcc -c support.c 

Всякий раз, когда я бегу Makefile с файлами, как определено выше, я всегда получаю ошибку множественного определения, несмотря на наличие условной компиляции.

Я не уверен, что здесь происходит и как решить проблему.

сообщение об ошибке:

multiple definition of `PI' 
multiple definition of `LOOP_LIMIT' 
+0

Включить настоящее сообщение об ошибке. – bmargulies

ответ

2

Вы не можете определить переменные в заголовок, который получает включены более чем одной единицы компиляции. PI и LOOP_LIMIT заканчиваются как в main.o, так и в support.o, поэтому вы получаете ошибку компоновщика. Правильный способ сделать это, объявив их extern в заголовке:

proto.h

#ifndef proto 
#define proto 
extern double PI; 
extern int LOOP_LIMIT; 

#endif 

И затем определяя их в одном и только один .c файл:

поддержка. с

#include "proto.h" 

double PI = 3.14159; 
int LOOP_LIMIT = 90; 

\\ only function defintions 

Кстати, похоже, что эти парни могут быть минусы Tants, а не переменные, так как объявить и определить их как const или написать их определения препроцессора:

#define PI 3.14159 
#define LOOP_LIMIT 90 

С тех, вы также избежать проблемы связывания.

+0

Бинго, это похоже на то, что нужно :) Только одно примечание, зачем было #define работать? Не будет ли попытка переопределить одно и то же, как с множественным определением переменных. –

+1

№ '# define' работает почти как операция копирования/вставки и обрабатывается препроцессором, прежде чем компилятор даже увидит код. Поэтому, если вы пишете «двойная окружность = диаметр PI *», компилятор увидит «двойная окружность = 3.14159 * диаметр». Фактический символ 'PI' вообще не заканчивается в скомпилированных объектных файлах. – Thomas

Смежные вопросы