Скомпилируйте redeclaration ошибку глобальной переменной в C++, но не в C

Предположим, что у меня есть те три файла:

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

9
задан coelhudo 8 January 2013 в 18:51
поделиться

2 ответа

В C две переменные фактически объединены в одну переменную, поскольку ни одна из них не инициализируется явно.

Если вы измените оба файла h на:

// a.h
int int_variable = 0;

и:

// b.h
int int_variable = 0;

, вы получите ошибку переопределения.

7
ответ дан 4 December 2019 в 21:49
поделиться

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

2
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

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