Почему не происходит ошибки при объявлении переменной в .h файле?

AVR и GCC, AVR это контроллеры, кто не в курсе. Но это не должно влиять на суть.
Программа на Си. Объявляю в .h переменную, просто int var;
В двух .с файлах делаю #include и ссылаюсь на эту переменную. Смотрю отладчиком - переменная одна, по одному адресу в памяти.

При этом такая конструкция в литературе запрещается, т.к. должна вызывать двойное определение, по идее должен ругаться компоновщик. Правильно в хедере писать extern int var, а объявление делать в каком-либо .с файле. Что происходит?

// test.c
#include "module.h"
void main()
{	
	var=0;
	inc();
	var++;
}

// module.h
#ifndef _MODULE_H
#define _MODULE_H
int var;
void inc();
#endif

// module.c
#include "module.h"
void inc()
{
	var++;
}
  • Вопрос задан
  • 2411 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Так можно делать в С, это tentative definition, объект обявленный таким образом попадает в область общих данных. При линковке одноимённые объекты в этой области становятся одним объектом.
В С++ так делать нельзя.

Правильно в хедере писать extern int var, а объявление делать в каком-либо .с файле

extern int var -- это и есть объявление. Правильно определение делать в одном .c файле.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alexclear
@alexclear
A cat
Не знаю, в какой литературе что запрещено, а у нас в gcc вот как:

sashka@cellar ~ cat test.h 
int i;
sashka@cellar ~ cat test.c
#include "test.h"
#include <stdio.h>

int main (void) {
i = 10;
printf("%i\n", i);
return 1;
}
sashka@cellar ~ gcc test.c -o test.out
sashka@cellar ~ ./test.out
10
sashka@cellar ~
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы