Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.190.147] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Обычно используют префикс "g_". Однако встает вопрос отличия глобальных переменных внутри 1 формы и доступных для всех форм. Как правильно называть данные виды переменных?
|
Сообщ.
#2
,
|
|
|
Хрестоматийных указаний нет. Вариантов много.
Можно тупо "global_имя", запутаться можно только под синькой или веществами. |
Сообщ.
#3
,
|
|
|
Никак. Правильно построенная программа не имеет проблемы глобальных/локальных переменных. И вообще, функции и объекты не должны работать с глобальными данными непосредственно. Если изучаете программирование самостоятельно, рекомендую отложить работу с GUI и "спуститься" на консольный C.
|
Сообщ.
#4
,
|
|
|
Цитата Fiodor @ Холиварно сие всё, но всё же убеждён, что таковой совет ("не должны работать") нужен исключительно для начинающих, в воспитательных целях. У нас у всех (у меня и знакомых) те или иные функции работают с теми или иными глобальными переменными; и при этом всё прекрасно вертится. И вообще, функции и объекты не должны работать с глобальными данными непосредственно. Названия же - где-как: есть и с чудо-префиксами, есть и просто уникальные. |
Сообщ.
#5
,
|
|
|
Ага, а давайте на каждую глобольную срань городить синглтон. Настоящие программисты везде должны городить объекты под паттернами.
|
Сообщ.
#6
,
|
|
|
Цитата applegame @ Ага, а давайте на каждую глобольную срань городить синглтон. Настоящие программисты везде должны городить объекты под паттернами. По мне, так лучше на каждую глобольную срань городить синглтон, нежели писать все в макросах, как некоторые любят Причем не просто #define TRUE FALSE, а целую такую функцию обязательно нужно нагородить, и сделать там какую нибудь ошибку, чтоб потом продебажить не получилось. Синглтоны хоть дебажить можно Ну а так, я конечно не стороник глобальных переменных или еще чего то, обычно если и юзаю то в пределах одного цппшника, но иногда без этих глобальных переменных не уйти. В том же COM'е есть пару вещей. Так что обычно что то типа g_НормальноеИПонятноеИмяПеременной. g_ пишу только исключительно ради того, что так быстрее найти нужное в хламе автокомплитера. Но можно и неймспейсы юзать. Да и вообще не помню когда в последний раз в каком нибудь хидере объявлял глобальную переменную. Добавлено Цитата Сергей85 @ Однако встает вопрос отличия глобальных переменных внутри 1 формы и доступных для всех форм. Как правильно называть данные виды переменных? namespace GlobalnayaPeremennayaForm1 - спасет тебя |
Сообщ.
#7
,
|
|
|
Цитата KILLER @ Ну а так, я конечно не стороник глобальных переменных или еще чего то, обычно если и юзаю то в пределах одного цппшника, но иногда без этих глобальных переменных не уйти. В глобальных переменных самое неприятное - это вот эта возможная ошибка: 1-й модуль: int i; int j; int k; 2-й модуль: extern int i; extern char j; extern int k; 3-й модуль: extern int i; extern int j; extern int k; Найти такую ошибку в большом проекте почти не возможно, особенно если extern-ы бессистемно разбросаны по многим модулям. --- Тогда берём и делаем класс, в котором объявляем статические переменные в public-секции. Вот и всё. Признак "глобальности" - принадлежность к классу. Все "глобальные" переменные (а заодно и константы) определены в одном месте, extern-ы исключены навсегда, а класс позволяет при необходимости добавлять методы для манипуляции с какими-то переменными (если недо). |
Сообщ.
#8
,
|
|
|
Цитата ЫукпШ @ Нехрен быдлокодить просто.Найти такую ошибку в большом проекте почти не возможно, особенно если extern-ы бессистемно разбросаны по многим модулям. header.h: extern int i; extern char j; extern int k; 1-й модуль: #include "header.h" int i; int j; // ошибка компиляции int k; 2-й модуль: #include "header.h" 3-й модуль: #include "header.h" Добавлено Одно определение на программу и по одному объявлению в каждом модуле в единственном месте исходных текстов. |
Сообщ.
#9
,
|
|
|
Цитата Qraizer @ Одно определение на программу и по одному объявлению в каждом модуле в единственном месте исходных текстов. Не надо сравнивать технику С и С++. Но если очень хочется именно стиль С, тогда пишем такой неадер: // // file globalVar.h // #ifdef MAINMOD // -------------- // vvvvvvvvvvvvvv int i; char j; // ^^^^^^^^^^^^^^ // .............. #else // .............. // vvvvvvvvvvvvvv extern char j; extern int i; // ^^^^^^^^^^^^^^ // -------------- #endif Вставляем его везде, где нужно. Но только в одном единственном модуле пишем: #define MAINMOD #include "globalVar.h" Тогда опять все глобальные переменные будут сосредоточены в одном месте и хоть как-то "структурированы типа". Получим простейшие правила добавления/удаления/редакции глобальных переменных. |
Сообщ.
#10
,
|
|
|
Цитата ЫукпШ @ Так это как раз техника C. В заголовке описываешь переменные, в одном из модулей их определяешь. Я обычно такие глобальные переменные даже определял в отдельном модуле, где кроме этих глобальных переменных ничего и не было.Не надо сравнивать технику С и С++. А так обычно статических, видимых только внутри файла, хватает. Добавлено Цитата ЫукпШ @ Можно даже такНо если очень хочется именно стиль С, тогда пишем такой неадер: файл globals.h #ifdef MAINMOD #define EXTERN #else #define EXTERN extern #endif EXTERN char j; EXTERN int i; #undef EXTERN Но в таком случае есть опасность определить MAINMOD в невскольких единицах трансляции, или вообще забыть его где-либо определить. |
Сообщ.
#11
,
|
|
|
Парни, по-моему, вы начинаете спорить, утверждая ... одинаковое)
* логично вынести все объявления глобальных переменных в один модуль (*.c или *.cpp) * оформить "заголовок" с "экстернами" и препроцессорной охраной множественного включения, либо #pragma once * включить инклюдами данный заголовок в каждый модуль Это все. |
Сообщ.
#12
,
|
|
|
Это всё. )
|
Сообщ.
#13
,
|
|
|
Цитата ЫукпШ @ Во-первых, это как раз C образца 1972 года. Во-вторых, касательно вон того ... я уже просил не ...хм, учить плохому. Не надо сравнивать технику С и С++. Но если очень хочется именно стиль С, тогда пишем такой неадер: ... Добавлено Цитата ЫукпШ @ Структурное программирование не для билдеровцев, да? Получим простейшие правила добавления/удаления/редакции глобальных переменных. |
Сообщ.
#14
,
Сообщение отклонено: Qraizer -
|
Сообщ.
#15
,
|
|
|
Цитата amk @ Добавлено Цитата ЫукпШ @ Можно даже такНо если очень хочется именно стиль С, тогда пишем такой неадер: файл globals.h #ifdef MAINMOD #define EXTERN #else #define EXTERN extern #endif EXTERN char j; EXTERN int i; #undef EXTERN Идея интересная, но реализация ужасная. В одном случае EXTERN это действительно extern, а в другом нет. Лучше другое какое-нибудь слово. Кроме того, такой способ даёт возможность определить только не инициализированные переменные, а это значит предложение выгодно только если не имеется инициализированных переменных или их мало. Добавлено Цитата amk @ Но в таком случае есть опасность определить MAINMOD в невскольких единицах трансляции, или вообще забыть его где-либо определить. Если это определение будет использовано неправильное количество раз, компилятор немедленно скажет об этом. Хватит ли у программиста интеллекта написать этот "define" один раз в главном модуле приложения ? Вопрос риторический. |