множественное определение "что-то" - PullRequest
0 голосов
/ 21 августа 2011

В "my_header.h" я определил

FILE *f;
char *logfile = "my_output.txt";
#define OPEN_LOG     f = fopen(logfile, "a")
#define CLOSE_LOG    fclose(f)

и в "my_source.c" я использовал его таким образом

#include "my_header.h"
....
OPEN_LOG;
fprintf(f, "some strings\n");
CLOSE_LOG;

Однако компоновщик говорит

my_source.o:(.data+0x0): multiple definition of `logfile'

Как я могу это исправить?

Ответы [ 2 ]

5 голосов
/ 21 августа 2011

Как всегда, не определяйте переменные в вашем заголовочном файле.Потому что каждый раз, когда вы #include используете этот заголовочный файл, эта переменная будет переопределяться (помните, что #include == "копировать и вставлять", эффективно), что приведет к ошибке компоновщика, которую вы видите.

2 голосов
/ 21 августа 2011

Вы должны создать новый файл (my_stuff.c) и иметь его там:

char *logfile = "my_output.txt";

.c файл определяет переменную.Затем измените заголовок, чтобы иметь это вместо определения:

extern char *logfile;

Это делает его декларацией .Теперь все должно работать, но вы должны скомпилировать дополнительный модуль и включить его в фазу соединения.(Подробная информация об этом зависит от ваших инструментов разработки.)

...