Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2010, 09:09   #1
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию Как вместо статических локальных переменных использовать переменные объявленные в namespace?

Сабж. Прочитал, что статические локальные переменные использовать не рекомендуется и вместо них нужно использовать переменные объявленные в namespace. Вот только как именно это сделать мне не совсем понятно. Я верно понимаю, что имеется ввиду вместо статических локальных переменных использовать глобальные переменные объявленные в namespace? И еще, хотелось бы узнать: чем плохи статические локальные переменные, и по чему их использование не рекомендуется?

Последний раз редактировалось Oleg_SK; 02.07.2010 в 09:12.
Oleg_SK вне форума Ответить с цитированием
Старый 02.07.2010, 09:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чем плохи статические локальные переменные
Когда узнаешь расскажи и мне, я тоже такое впервые слышу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2010, 09:36   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

можеть быть имеются ввиду одинаковые названия переменных? Для этого и создали пространство имен. Вот пример:

Код:
#include <iostream>

namespace my_library {
    int A;
}

int A;
int main(void){
     A = 5;
     my_library::A = 10;
     return 0;
}
На сколько я знаю, статические лок. переменные это те, которые создаются при вызове функции один раз:
Код:
void foo(){
    static int count=0;
    count++;
}
при каждом вызове foo() count будет увеличиваться, а если убрать static
Код:
void foo(){
    int count=0;
    count++;
}
сколько раз foo() не вызовешь, count будет 0, так как count создается на каждом вызове функции
какое отношение эти переменные имеют к пространству имен я не понимаю...

Последний раз редактировалось NiCola999; 02.07.2010 в 09:49.
NiCola999 вне форума Ответить с цитированием
Старый 02.07.2010, 10:46   #4
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Stilet
Сорри, возможно, что я что-то не так понял... Сейчас вообще не могу вспомнить, где я это прочитал. Возможно это связано с книгой Джеса Либерти и Брэдли Джонса "Освой самостоятельно C++ за 21 день"; в ней кстати вообще нет темы по статическим переменным (ни локальным, ни глобальным).

Сейчас глянул книгу Герберта Шилдта "Полный справочник по C++" и во 2 главе после описания локальных и глобальных статических переменных нашел следующую информацию:
Цитата:
Модификатор static позволяет скрывать часть программы от других модулей. Это черезвычайно важно при разработке больших и сложных программ.
На заметку В языке C++ эта особенность модификатора static сохраняется, но объявлена нежелательной. Это означает, что при разработке новых программ ипользовать это войство не рекомендуется. Вместо него следует использовать пространства имен...
Из этого можно сделать вывод, что использование глобальных статических переменных не рекомендуется. Возможно, что об этом же говорилось и в вышеупомянутом самоучителе. Однако в этом самоучителе нет и темы по локальным статическим переменным, и из-за этого у меня сложилось впечатление, что их использовать тоже не рекомендуется...

Последний раз редактировалось Stilet; 02.07.2010 в 11:40.
Oleg_SK вне форума Ответить с цитированием
Старый 02.07.2010, 11:34   #5
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Вот те пример:
module.h
Код:
#pragma once
module.cpp:
Код:
#include "module.h"

int var;
static int svar;

void func() {}
static void sfunc() {}
main.cpp:
Код:
#include "module.h"

extern int var;
extern int svar;

extern void func();
extern void sfunc();


int main(int, char **)
{
	
	var = 0;
	svar = 0;
	func();
	sfunc();
	
	return 0;
}
У меня в программе есть интерфейс - module.h и реализация module.cpp. То, что я хочу, чтобы видели другие модули, помещается в module.h. Здесь он пустой. Т.е. я не хочу, чтоб за пределы module.cpp просочилось что-то из:

int var;
static int svar;

void func() {}
static void sfunc() {}

Так вот, модификатор extern позволяет добраться до переменных и функций, которые не объявлены в прямой видимости. Модификатор static скрывает объекты полностью (если их конечно не объявить в h файле). В данном примере компилятор не найдёт объявления svar и sfunc, а var и func без проблем.

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

А по поводу неймспейсов. Не понимаю, каким они здесь боком, ведь:
module.h:
Код:
#pragma once
module.cpp:
Код:
#include "module.h"

namespace N
{
	int var;
	static int svar;

	void func() {}
	static void sfunc() {}
}
main.cpp:
Код:
#include "module.h"

namespace N
{
	extern int var;
	extern int svar;

	extern void func();
	extern void sfunc();
}

int main(int, char **)
{
	
	N::var = 0;
	N::svar = 0;
	N::func();
	N::sfunc();
	
	return 0;
}
тоже не видит только svar и sfunc.

Последний раз редактировалось Carbon; 02.07.2010 в 11:43.
Carbon вне форума Ответить с цитированием
Старый 02.07.2010, 11:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Поэтому статик в плюсах именно в этом контексте устарел.
Ну-у-у... Это не смертельно )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2010, 11:45   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Так я не сказал, что запрещён. Я сказал, что устарел. Если честно, ни разу не видел, чтоб кто-то его так использовал.
Carbon вне форума Ответить с цитированием
Старый 02.07.2010, 11:52   #8
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Цитата:
в плюсах появились классы, поэтому вообще не рекомендуется использовать функции...
А как можно без функций обойтись? К примеру, как сделать оконную функцию или функцию main() методом класса? Да и вообще, я что-то с трудом представляю себе программу без функций...
Oleg_SK вне форума Ответить с цитированием
Старый 02.07.2010, 11:59   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Oleg_SK Посмотреть сообщение
А как можно без функций обойтись? К примеру, как сделать оконную функцию или функцию main() методом класса? Да и вообще, я что-то с трудом представляю себе программу без функций...
main - это исключение. Да и, если где-то требуется в качестве чего-то адрес функции, то обычную функцию ничем не заменить.

Опять повторюсь: не запрещается, а не рекомендуется. Т.е. хорошим тоном считается использовать классы. Ну например: захотел создать свой модуль с кучей глобальных переменных и функций - 10 раз подумай, может лучше в класс объединить?
Carbon вне форума Ответить с цитированием
Старый 02.07.2010, 12:37   #10
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Вот в C# это хорошо и реализовано, там вообще все на классах реализовано, а С# как известно потомок C++, т.е. так сказать улучшенная версия
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать переменные в ссылках на ячейки Klamm Microsoft Office Excel 6 14.04.2012 01:44
Title на форме. Как можно перерисовать caption на form? Или убрать его и вместо использовать картинки Шульц Общие вопросы Delphi 37 02.10.2010 09:46
Что можно использовать вместо динамических массивов. Evgen1503 Общие вопросы Delphi 8 14.01.2010 21:54
использование конструкции "using <namespace>::<namespace-member>" happy_horror Общие вопросы C/C++ 5 08.03.2009 15:30
Как правильно использовать переменные в процедурах nikolai_P Microsoft Office Excel 22 15.05.2008 13:15