Ошибка 'дублирующееся определение' при компиляции двух файлов C та ссылка один заголовочный файл

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

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

char c = 0;

file1.c:

#include "header.h"

file2.c:

#include "header.h"

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

5
задан Gabe 16 March 2010 в 22:02
поделиться

4 ответа

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

#define c d
#include "header.h"

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

0
ответ дан 18 December 2019 в 09:48
поделиться

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

3
ответ дан 18 December 2019 в 09:48
поделиться

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

header:

extern char c;

implementation:

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

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

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

#ifndef HEADER_H
#define HEADER_H

... header file contents ...

#endif
14
ответ дан 18 December 2019 в 09:48
поделиться

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

0
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: