У меня есть два файла C и один заголовок, которые являются следующие:
Заголовочный файл header.h:
char c = 0;
file1.c:
#include "header.h"
file2.c:
#include "header.h"
Меня предупредили о 'дублирующемся определении' при компиляции. Я понимаю причину, поскольку переменная c определяется дважды и в file1.c и в file2.c; однако, я действительно должен сослаться на header.h в обоих c файлы. Как я должен преодолеть эту проблему?
Если вы не можете изменить заголовок, то в качестве хака, в одном (но не в обоих) из ваших исходных файлов, вы можете сделать следующее:
#define c d
#include "header.h"
В результате char c = 0;
станет char d = 0;
, но, конечно, в любом другом месте, где используется c
, он также станет d
, так что это может вообще не работать.
Используйте extern char c
в заголовке и char c = 0
в одном из ваших файлов .c
.
Во-первых, не определяйте переменные в заголовках. Используйте квалификатор 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
Для чего используется char c
? Вероятно, вы хотите, чтобы это был extern char c
, или если вы хотите, чтобы это была отдельная переменная для каждой единицы компиляции (исходный файл), тогда вы должны использовать static char c