Ошибка «дублирующее определение» при компиляции двух файлов C, которые ссылаются на один заголовочный файл - PullRequest
4 голосов
/ 17 марта 2010

У меня есть два файла C и один заголовок, которые выглядят следующим образом:

Заголовочный файл header.h:

char c = 0;

file1.c:

#include "header.h"

file2.c:

#include "header.h"

При компиляции меня предупреждали о «дублирующем определении». Я понимаю причину, поскольку переменная c определяется дважды как в file1.c, так и в file2.c; Однако мне нужно сослаться на header.h в обоих файлах c. Как мне преодолеть эту проблему?

Ответы [ 4 ]

14 голосов
/ 17 марта 2010

Во-первых, не определяйте переменные в заголовках. Используйте квалификатор extern при объявлении переменной в заголовочном файле и определите ее в одном (не обоих) ваших файлах C или в своем новом новом файле, если вы предпочитаете.

Заголовок:

extern char c;

реализация:

#include <header.h>
char c = 0;

Кроме того, вы можете оставить определение в заголовке, но добавить static. Использование static приведет к другому поведению программы, чем использование extern, как в примере выше, поэтому будьте осторожны. Если вы сделаете это static, каждый файл, содержащий заголовок, получит свою собственную копию c. Если вы используете extern, они поделятся одной копией.

Во-вторых, используйте защиту от двойного включения:

#ifndef HEADER_H
#define HEADER_H

... header file contents ...

#endif
3 голосов
/ 17 марта 2010

Используйте extern char c в заголовке и char c = 0 в одном из .c файлов.

0 голосов
/ 17 марта 2010

Если вы не можете изменить заголовок, то в качестве хака в одном (но не в обоих) ваших исходных файлах вы можете сделать следующее:

#define c d
#include "header.h"

Это приведет к тому, что char c = 0; станет char d = 0;, но, конечно, в любом другом месте, где используется c, оно также станет d, поэтому оно может вообще не работать.

0 голосов
/ 17 марта 2010

Для чего используется char c? Вы, вероятно, хотите, чтобы это было extern char c, или если вы хотите, чтобы это было отдельной переменной для каждой единицы компиляции (исходного файла), тогда вы должны использовать static char c

...