Предположим, что у меня есть те три файла:
a.h
//a.h header
#include <stdio.h>
int int_variable;
void a_f()
{
printf("int_variable: %d\n", int_variable)
int_variable++;
}
b.h
//b.h header
#include <stdio.h>
int int_variable;
void b_f()
{
printf("int_variable: %d\n", int_variable)
int_variable++;
}
main.c
//main.c
#include "a.h"
#include "b.h"
int main()
{
a_f();
b_f();
return 0;
}
Почему компиляция в C++ генерирует ошибку переопределения, но в C не делает? Я - разработчик C++, затем в C++ имеет смысл мне, но почему в C это не ошибка?
Когда я выполнился, C сгенерировал код, вывод был:
международная переменная: 0
международная переменная: 1
В C две переменные фактически объединены в одну переменную, поскольку ни одна из них не инициализируется явно.
Если вы измените оба файла h на:
// a.h
int int_variable = 0;
и:
// b.h
int int_variable = 0;
, вы получите ошибку переопределения.
Глобальные переменные в файле заголовка следует использовать только вместе с модификатором extern. Без исключений. Вперед объявите вашу переменную в одном или нескольких файлах заголовков (желательно только в одном), а затем определите ее ровно в одной единице компиляции.