Вопрос по c/c++

vlad0951
Offline
Зарегистрирован: 08.07.2016

Здравствуйте. Столкнулся с проблеммой, вернее не с проблеммой а особенностью:

Допустим есть некая библиотека:

lib.h и lib.cpp, заголовочный файл и файл с описанием функций, методов и тд.

В файле lib.h указано #include "lib.h" - что логично.

Допустим я подключаю эту библиотеку к своему проекту:

----------

#include "lib.h"

int main(){return 0;}

----------

Если я хочу например добавить пару вспомогательных переменных в файл lib.h, то при компиляции возникает ошибка, multiply defenition (переопределение типа) что вполне логично, т.к. заголовочный файл подключается 2 раза. Слово extern решает эту проблему? Будет ли видна эта переменная объявленная в заголовочном файле в файлах исходного кода?

Logik
Offline
Зарегистрирован: 05.08.2014

vlad0951 пишет:

В файле lib.h указано #include "lib.h" - что логично.

не логично. В lib. включают lib.h. А lib.h в lib.h нет.

Для защиты от повторного включения в начале lib.h пишут типа

#ifndef FIXFFT_H

#define FIXFFT_H
 
extern в lib.h означает что данная переменная будет обявлена гдето позже, видна везде куда включат lib.h
vlad0951
Offline
Зарегистрирован: 08.07.2016

Logik пишет:

vlad0951 пишет:

В файле lib.h указано #include "lib.h" - что логично.

не логично. В lib. включают lib.h. А lib.h в lib.h нет.

Для защиты от повторного включения в начале lib.h пишут типа

#ifndef FIXFFT_H

#define FIXFFT_H
 
extern в lib.h означает что данная переменная будет обявлена гдето позже, видна везде куда включат lib.h

благодарю за ответ, да я перепутал в lib.cpp пишут lib.h. Директивы препроцессора выставил

Как я понимаю extern использовать так:

lib.h:

........

extern int c;

.......

lib.cpp:

.......

int c;

.......

main.cpp

.....

int c;

.....

Будут ли эти "с" относится к олному и тому же участку памяти?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет. Объявлять надо один раз, только в одном из файлов, а не в двух, как у Вас.

axill
Offline
Зарегистрирован: 05.09.2011

слово extern используется для описания переменной без выделения для нее памяти

поэтому такое определение может встречаться несколько раз, когда мы включаем это определение в заголовок библиотечного lib.h то о существовании переменной и о ее типе узнает и пользовательская программа и библиотечная, что логично

само определение переменной без слова extern выделяет под переменную память и не может встречаться несколько раз, должно быть одно. Для библиотечной переменной логично это определение поместить в lib.cpp