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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2011, 22:04   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

#define KOL 10

void Foo(int val) { if( val==KOL) { std::cout<< "Урра!\n"; } }
int main()
{
int val;
int val; //хочу иметь переменную с таким именем
Foo(10);
Foo(KOL);
}

посты 13 и 17 не отвечают на поставленные вопросы.
_Bers вне форума Ответить с цитированием
Старый 18.12.2011, 22:09   #22
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
[CODE]
const не требует extern
Поподробнее. Как мне делать константу "мама" видимой для всех единиц трансляции?
_Bers вне форума Ответить с цитированием
Старый 18.12.2011, 22:11   #23
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а я хочу именно KOL, почему я должен следить за всеми этими дефайнами(и из инклюдов)? прикиньте сколько их будет если все константы переписать на дефайны, и сколько конфликтов будет?

я перечислил уже недостатки, потому опровергните их.

единичиный дефайн не так вреден, но когда они идут постоянно, это может навредить, потому лучше сразу привыкнуть к хорошему коду.
Цитата:
Поподробнее. Как мне делать константу "мама" видимой для всех единиц трансляции?
выносить в общий хидер, так же как и с дефайном, но эту константу вы можете внести в пространство имен.
Код:
const char* T="мама";
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 18.12.2011 в 22:14.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.12.2011, 22:21   #24
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а я хочу именно KOL, почему я должен следить за всеми этими дефайнами(и из инклюдов)? прикиньте сколько их будет если все константы переписать на дефайны, и сколько конфликтов будет?

я перечислил уже недостатки, потому опровергните их.

единичиный дефайн не так вреден, но когда они идут постоянно, это может навредить, потому лучше сразу привыкнуть к хорошему коду.выносить в общий хидер, так же как и с дефайном, но эту константу вы можете внести в пространство имен.
Код:
const char* T="мама";
0. А я хочу std::string свой собственный. Чего он ругаеццо то?

1. Дефайны в пределах отдельной единицы трансляции другим единицам тренсаляции жить никак не мешают.


2. Дефайны, определенные через хэдэр, всегда можно сделать видимыми только клиентами этих дефайнов, и похоронить их в неком obj (cpp)

3. const char* t= "мама"; в хэдэре не объявишь. А значит, такую константу не увидят другие единицы трансляции, или extern вас очень любит.
_Bers вне форума Ответить с цитированием
Старый 18.12.2011, 22:31   #25
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

0) вы можете обьявить свое пространство имен, а не лезть в чужое, и причем известное.
дефайн же не знает понятия область видимости.
1)почему по вашему нельзя сразу привыкнуть к хорошему стилю, чтоб потом не жалеть?
2)дефайны нельзя скрыть, они или есть или их нет, разве что через условную компиляцию, но это глупо.
3)обьявил и скомпилировал. проект из двух cpp.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.12.2011, 22:37   #26
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
0) вы можете обьявить свое пространство имен, а не лезть в чужое, и причем известное.
дефайн не знает понятия область видимости.
1)почему по вашему нельзя сразу привыкнуть к хорошему стилю, чтоб потом не жалеть?
2)дефайны нельзя скрыть, они или есть или их нет, разве что через условную компиляцию, но это глупо.
3)обьявил и скомпилировал.
0 Любой компилятор пофиксит переопределение. Если имело место быть преопределению, стало быть нужно назвать свою переменную как то иначе.

В случае, с дефайном, будит иметь место ошибка компиляции.

1. Хороший стиль - превентивно безопасный код. Это значит, что инструмент используется согласно документации, и по назначению. Тогда все будит в порядке.

Если делать #define true false то опять таки, защиты от маразма не существует. И с++ предоставит извращенцам массу способов отстрелить себе ногу.

2. Дефайны можно не просто скрыть, но и вовсе отменить той же самой диррективой препроцессора. Если очень надо. (а это не нужно, ибо от извращенцев защиту делать просто глупо)

3. Работа с дефайнами ничем не отличается от работы с константами, за исключением того, что они создают меньше проблем

(объяви в хэдэре "мама", попробуй скомпилировать, а потом наслаждайся общением с extern)
_Bers вне форума Ответить с цитированием
Старый 18.12.2011, 22:52   #27
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
3. Работа с дефайнами ничем не отличается от работы с константами, за исключением того, что они создают меньше проблем
не видел меньше проблем.
попробуйте заменить константы вида
Код:
phL::LexicalScanner::L_NULL
на дефайн, и отказаться от них нельзя, причем коду стоит кишить такими константами, так как
Цитата:
(объяви в хэдэре "мама", попробуй скомпилировать, а потом наслаждайся общением с extern)
хорошо, но если вы умеете правильно организовывать проекты, то проблемы не возникает.
так как строковые константы обьявляют память, то они должны быть в cpp файле, а в .h обьявление с extern.
дефайн же в каждой единице трансляции выделяет память, если строка маленькая то фиг с ним, а если приличного размера?
Цитата:
В случае, с дефайном, будит иметь место ошибка компиляции.
в случае #define KOL 10
этот код вылетит
Код:
namespace phL
{
    const unsigned KOL=10;
}
в случае же const, все будет отлично.
Цитата:
1. Хороший стиль - превентивно безопасный код. Это значит, что инструмент используется согласно документации, и по назначению. Тогда все будит в порядке.
чему не соответствует define.

Цитата:
Если делать #define true false то опять таки, защиты от маразма не существует. И с++ предоставит извращенцам массу способов отстрелить себе ногу.
вот именно, так может стоит сразу использовать метод который не будет все портить?
Цитата:
0 Любой компилятор пофиксит переопределение. Если имело место быть преопределению, стало быть нужно назвать свою переменную как то иначе.
ни студия ни gcc не выдали даже предупреждение насчет переопределения true.

стоит знать как идет процесс компиляции С++ кода, а какое место занимает препроцессинг в нем.
а именно препроцессинг идет до стадии компиляции, препроцессинг просто заменяет код, не капли не анализуя его.
в итоге компилятор не знает о том что было сделано.

PS: ну это ваше дело, я уже видел все эти грабли, и наступал на них.
повторять чужие ошибки или нет, это дело ваше.
PPS: не спроста же я отказался от препроцессора в своем ЯП.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 18.12.2011 в 22:56.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.12.2011, 22:54   #28
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

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

Цитата:
Работа с дефайнами ничем не отличается от работы с константами, за исключением того, что они создают меньше проблем
Чепуха. См. выше. А еще у констант можно брать адрес, делать на них константные ссылки, применять к ним sizeof и прочее. Константы позволяют избегать повторных конструирований и вычислений.

const char* T="мама";
Мда... И это то константа? const char* const T - вот константа.

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

PS препроцессор иногда очень полезен, не стоит слишком категорично его ругать)

Последний раз редактировалось still_alive; 18.12.2011 в 22:57.
still_alive вне форума Ответить с цитированием
Старый 18.12.2011, 23:28   #29
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Мда... И это то константа? const char* const T - вот константа.
ну тут да, ошибся, но смысл это не меняет, все равно нужен extern, хотя насчет них я уже все сказал, надо уметь применять.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.12.2011, 00:02   #30
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Поэтому ярые любители дефайнов никогда не закоммитят ничего в большой проект - код просто не будет проходить ревью.
Точно
У нас в требованиях к написанию кода об этом сказано
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как проще ее написать? 777pro777 Помощь студентам 4 25.10.2011 15:05
Как проще сравнивать даты? silvestr PHP 13 17.04.2011 22:24
может можно сделать проще??? Donatello Общие вопросы C/C++ 6 10.01.2011 19:09
Разворачивающиеся меню. Как проще? Web-Gangsta JavaScript, Ajax 4 05.05.2009 17:46
Можно ли проще сделать задачу на паскале? svobodys Помощь студентам 8 02.12.2008 19:53