Глобальные переменные по всем файлам (Как осуществить?)

Модератор: Модераторы разделов

Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Глобальные переменные по всем файлам

Сообщение Assuri »

Есть несколько переменных, которые записаны во всех файлах программы, но я хочу, чтобы они все были в одном отдельном файле config.h, которые должен подключаться ко всем файлам. Я пробовал эксперементировать с extern, объявлял в начале config.h спец переменную, чтобы исключить повторение объявлений переменных:

Код: Выделить всё

#ifndef CONFIG
#define CONFIG

QString HOME_PATH = "xx";
QString TrDir = "xxX";

#endif

Но все равно ничего не выходит, ошибка:
build/settingsdialog.o:(.bss+0x18): multiple definition of `HOME_PATH'
build/mainwidget.o:(.bss+0x18): first defined here
build/settingsdialog.o:(.bss+0x14): multiple definition of `TrDir'
build/mainwidget.o:(.bss+0x14): first defined here

Что не так?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Глобальные переменные по всем файлам

Сообщение sergio »

-DooM- писал(а):
17.11.2007 13:57
Что не так?

Определения переменных бывают, и бывают объявления переменных. Так вот, объявить их надо в конфиг.х, а определить в cpp и скомпилировать в модуль .о, который слинковать со всем остальным. В конфиг.х они соотв-но объявляются как экстрен.

"Экстерн" - переменная "где-то вне" данного модуля компиляции, и ее адрес, определение, проч будет соотнесено на этапе линковки.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: Глобальные переменные по всем файлам

Сообщение Assuri »

sergio писал(а):
17.11.2007 14:05
-DooM- писал(а):
17.11.2007 13:57
Что не так?

Определения переменных бывают, и бывают объявления переменных. Так вот, объявить их надо в конфиг.х, а определить в cpp и скомпилировать в модуль .о, который слинковать со всем остальным. В конфиг.х они соотв-но объявляются как экстрен.

"Экстерн" - переменная "где-то вне" данного модуля компиляции, и ее адрес, определение, проч будет соотнесено на этапе линковки.

Если я правильно понял, то:
Config.h

Код: Выделить всё

#ifndef CONFIG_H
#define CONFIG_H

#include <QString>

extern QString homepath;

#endif

Config.cpp

Код: Выделить всё

#include "config.h"

homepath = "xx";

Результат:
src/config.cpp:4: error: expected constructor, destructor, or type conversion before ‘=’ token
src/config.cpp:6: error: expected constructor, destructor, or type conversion before ‘=’ token
src/config.cpp:8: error: expected constructor, destructor, or type conversion before ‘=’ token

Ошибку я понимаю, но не создавать же мне целый класс!
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Глобальные переменные по всем файлам

Сообщение sergio »

-DooM- писал(а):
17.11.2007 14:20
Config.cpp

Код: Выделить всё

#include "config.h"

homepath = "xx";

Результат:
src/config.cpp:4: error: expected constructor, destructor, or type conversion before ‘=’ token
src/config.cpp:6: error: expected constructor, destructor, or type conversion before ‘=’ token
src/config.cpp:8: error: expected constructor, destructor, or type conversion before ‘=’ token

Ошибку я понимаю, но не создавать же мне целый класс!

Ну а тип имени-то кто компилятору подсказывать должен??

Код: Выделить всё

QString homepath = "xx";


Хедер соотв-но включаете во все те модули где есть ссылки на эту и прочие глобальные переменные...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Глобальные переменные по всем файлам

Сообщение drBatty »

-DooM- писал(а):
17.11.2007 14:20
Ошибку я понимаю, но не создавать же мне целый класс!

Так у тебя же инициализация, это вызов конструктора класса. А откуда компилятор узнает код конструктора? Надо описание класса вставить в .h файл, и этот файл пихать везде, где используется этот класс(в т.ч. и там, где записаны методы этого класса) Пример надо?
Глобальные переменные тоже описываешь в .h файлах с extern. К примеру посмотри как это сделано в <errno.h> Но там тип int, знакомый компилятору. С твоими типами тебе придётся самому ознакомить.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: Глобальные переменные по всем файлам

Сообщение Assuri »

sergio писал(а):
17.11.2007 14:36
Ну а тип имени-то кто компилятору подсказывать должен??

Результат:
src/config.cpp:12: error: ‘QSrting’ does not name a type
src/config.cpp:15: error: ‘QSrting’ does not name a type
src/config.cpp:17: error: ‘QSrting’ does not name a type

Хедер соотв-но включаете во все те модули где есть ссылки на эту и прочие глобальные переменные...

Естесственно.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Глобальные переменные по всем файлам

Сообщение sergio »

-DooM- писал(а):
17.11.2007 14:42
Результат:
src/config.cpp:12: error: ‘QSrting’ does not name a type


(устало) Внимательнее, DOOM. У вас же обычная опечатка...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: Глобальные переменные по всем файлам

Сообщение Assuri »

sergio писал(а):
17.11.2007 14:45
-DooM- писал(а):
17.11.2007 14:42
Результат:
src/config.cpp:12: error: ‘QSrting’ does not name a type


(устало) Внимательнее, DOOM. У вас же обычная опечатка...

Чтобы я без Вас делал... Спасибо огромное!
Спасибо сказали: