Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: глобальные переменные/namespace в проекте  (Прочитано 1065 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
проблема такая:
пусть проект состоит из файлов main.cpp lib.h lib.cpp
в файле lib.h объявлен некоторый namespace:
namespace ns {
int test;
};
void fun(void);
....
, который используется в lib.cpp#include "lib.h"
...
void fun (void) {
...
ns::test=1;
...
}
и в main.cpp#include "lib.h"
...
int main(void) {
...
ns::test=0;
...
)
при компиляции вылезает ошибка дублирования namespace при линковке, как побороть?
#ifndef LIB_H_
#define LIB_H_
...
#endif
естественно используется, суть именно в namespace, аналогичная проблема, если объявить глобальную переменную.
« Последнее редактирование: 26 Января 2014, 07:26:18 от dronte »

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: глобальные переменные/namespace в проекте
« Ответ #1 : 26 Января 2014, 05:19:00 »
Этот ваш некоторый namespace объявлять,
в файлах проекта.

Не уверен,
ибо как-то не четко сформулирован вопрос.

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: глобальные переменные/namespace в проекте
« Ответ #2 : 26 Января 2014, 07:19:42 »
Скажите, что именно нечетко и какой информации не хватает?

здесь для примера и взят проект состоящий из main.cpp lib.h lib.cpp
можно даже здесь makefile написать:
CC=g++
GFLAGS=-c -Wall

all: main

main: main.o lib.o
$(CC) main.o lib.o -o main
main.o: main.cpp lib.h
$(CC) $(GFLAGS) main.cpp

lib.o: lib.cpp lib.h
$(CC) $(GFLAGS) lib.cpp

clean:
rm main.o lib.o

« Последнее редактирование: 26 Января 2014, 07:24:06 от dronte »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Re: глобальные переменные/namespace в проекте
« Ответ #3 : 26 Января 2014, 11:25:23 »
Своих namespace я никогда не строил, а глобальная переменная должна быть
объявлена только в одном модуле как обычно, а во всех остальных,
в которых к ней нужен доступ, она должна быть объявлена как extern.
Тогда не будет двойной линковки.
Пётр.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: глобальные переменные/namespace в проекте
« Ответ #4 : 26 Января 2014, 12:05:43 »
Топикастеру, предлагаю писать программу одним
файлом - без заморочек.
Программы, до 1000 строк на любом языке программирования,
пишутся легко.

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: глобальные переменные/namespace в проекте
« Ответ #5 : 26 Января 2014, 15:49:03 »
Если бы до тысячи ....
да и сдача проекта у нас подразумевает такое оформление ...

Peter_I, спасибо, буду пробовать!

update: Да, с глобальными переменными вопрос решен! Но с namespace увы еще нет, хотелось бы и здесь разобраться.
update2: Не знаю, почему мне не пришло в голову, поступить так сразу и не мучиться с костылями для решения подобных проблем, в общем нужно было только посмотреть /usr/include/c++/4.7/iostrem, после чего додуматься написать точно также:
//Листинг lib.h
#ifndef LIB_H_
#define LIB_H_
namespace ns {
   extern int value;
};
...
#endif
//Листинг lib.cpp
#include "lib.h"
namespace ns {
   int value;
};
...
//Листинг main.cpp
#include "lib.h"
...

Вот и все решение проблемы!
« Последнее редактирование: 26 Января 2014, 19:21:02 от dronte »

 

Страница сгенерирована за 0.028 секунд. Запросов: 25.