LINUX.ORG.RU

С++, вопрос о включениях


0

0

Есть .h-файл с глобальными переменными. Разные переменные оттуда должны использоваться в разных .cpp-файлах в проекте (подразумевается, что в этом .h-файле будут лежать все строковые константы проекта). В общем случае ситуацию можно описать так:

[ main.cpp ]

#include "header.h"
#include "glib/gprintf.h"

int main()
{
    g_printf("%d %d", Func1(), Func2());
}

[ header.h ]

#ifndef HEADER_H_
#define HEADER_H_

int Func1();
int Func2();

#endif

[ first.cpp ]

#include "header.h"
#include "additional.h"

int Func1()
{
    return Variable1;
}

[ second.cpp ]

#include "header.h"
#include "additional.h"

int Func2()
{
    return Variable2;
}

[ additional.h ]

#ifndef SECOND_H_
#define SECOND_H_

int Variable1;
int Variable2;

#endif 

Код нормально компилируется, но на этапе линковки возникает ошибка:

G:/Projects/Temp/Debug/../first.cpp:5: multiple definition of `Variable1' second.o:G:/Projects/Temp/Debug/../second.cpp:5: first defined here first.o: In function `Z5Func1v': G:/Projects/Temp/Debug/../first.cpp:6: multiple definition of `Variable2' second.o:G:/Projects/Temp/Debug/../second.cpp:6: first defined here collect2: ld returned 1 exit status Build error occurred, build is stopped

Как избежать этого? Ещё - эти глобальные переменные должны обязательно задаваться как переменные, а не через #define.

★★★★★

Ответ на: комментарий от lester

man extern

Такой длинный вопрос и такой короткий ответ. :)

немного поясню

в файле .h пиши

extern int Variable1;

а так же нужен файл .сpp который будет содержать саму переменную

int Variable1;

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

а так же нужен файл .сpp который будет содержать саму переменную

А может быть он должен инициализировать её значением?

ShTH
()
Ответ на: комментарий от ShTH

А, прошу прощения, всё верно. Плохо вспомнил что такое extern)

ShTH
()

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

alex_custov ★★★★★
()
Ответ на: комментарий от pathfinder

>в файле .h пиши

extern int Variable1;

а так же нужен файл .сpp который будет содержать саму переменную


int Variable1;



хм, таким образом ещё не пробовал, сейчас попробую.

jcd ★★★★★
() автор топика
Ответ на: комментарий от jcd

первым делом пытался сунуть extern куда только можно

http://www.linux.org.ru/view-message.jsp?msgid=4260314

при возникновении данной ошибки просто наугад ставил «class SomeClass;» или инклудил какой_нибудь файл

тенденция? массовый психоз как осложнение от гриппа?

jtootf ★★★★★
()
Ответ на: комментарий от alex_custov

> Я бы воспользовался синглтоном структуры.

Наивная попытка избежать Возмездия за использование глобальных переменных, поместив их все в одну структуру? :)

const86 ★★★★★
()
Ответ на: комментарий от LamerOk

>Скорее объединить их всех в их земной юдоли под владычеством всесильным.. ээээ в одном месте.

hint: антипаттерны/синглтонизм

lester_dev ★★★★★
()

Всё отлично работает, всем большое спасибо.

jcd ★★★★★
() автор топика
Ответ на: комментарий от stpg

>Global variables are Evil without a doubt

Топикстартер !!! Не слушай его! Глобальные переменные-константы (как было сказано, если внимательно прочитать вопрос)вполне могут быть безопасны. И тут совершенно не нужны лишние костыли.

А вот если переменные в ходе основной работы программы будут меняться (т.е. это уже не константы) то тут есть над чем задуматься.

Я сам очень часто делаю глобальные переменные, которые формируються во время инициализации программы, и не меняются в ходе её основной работы. При этом я не страдаю от проблем.

З.Ы. Единственное, что надо учесть один момент. Если пишешь многонитевое приложение, то доступ к этим переменным должен быть только у одной нити. В противном случае опять надо думать как поступить.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

> Глобальные переменные-константы (как было сказано, если внимательно прочитать вопрос)вполне могут быть безопасны.

Константы объявляются со словом const :) На самом деле, неважно. Неконстантные глобальные переменные тоже вполне можно нормально заюзать в каких-то случаях, надо только не забыть крепко подумать. А вот заворачивание во всякие структуры и синглтоны ничуть не меняет ситуацию, только хитро её маскирует.

const86 ★★★★★
()
Ответ на: комментарий от const86

> А вот заворачивание во всякие структуры и синглтоны ничуть не меняет ситуацию

При проекте в более чем один файл меняет. Ясно, где искать, куда добавлять и т.п.

Разумная альтернатива - грамотная организация хидеров, но надо отслеживать, чтоб не засрали.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.