|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.12.2011, 22:04 | #21 |
Старожил
Регистрация: 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 не отвечают на поставленные вопросы. |
18.12.2011, 22:09 | #22 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
18.12.2011, 22:11 | #23 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
а я хочу именно KOL, почему я должен следить за всеми этими дефайнами(и из инклюдов)? прикиньте сколько их будет если все константы переписать на дефайны, и сколько конфликтов будет?
я перечислил уже недостатки, потому опровергните их. единичиный дефайн не так вреден, но когда они идут постоянно, это может навредить, потому лучше сразу привыкнуть к хорошему коду. Цитата:
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 18.12.2011 в 22:14. |
|
18.12.2011, 22:21 | #24 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
1. Дефайны в пределах отдельной единицы трансляции другим единицам тренсаляции жить никак не мешают. 2. Дефайны, определенные через хэдэр, всегда можно сделать видимыми только клиентами этих дефайнов, и похоронить их в неком obj (cpp) 3. const char* t= "мама"; в хэдэре не объявишь. А значит, такую константу не увидят другие единицы трансляции, или extern вас очень любит. |
|
18.12.2011, 22:31 | #25 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
0) вы можете обьявить свое пространство имен, а не лезть в чужое, и причем известное.
дефайн же не знает понятия область видимости. 1)почему по вашему нельзя сразу привыкнуть к хорошему стилю, чтоб потом не жалеть? 2)дефайны нельзя скрыть, они или есть или их нет, разве что через условную компиляцию, но это глупо. 3)обьявил и скомпилировал. проект из двух cpp. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
18.12.2011, 22:37 | #26 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
В случае, с дефайном, будит иметь место ошибка компиляции. 1. Хороший стиль - превентивно безопасный код. Это значит, что инструмент используется согласно документации, и по назначению. Тогда все будит в порядке. Если делать #define true false то опять таки, защиты от маразма не существует. И с++ предоставит извращенцам массу способов отстрелить себе ногу. 2. Дефайны можно не просто скрыть, но и вовсе отменить той же самой диррективой препроцессора. Если очень надо. (а это не нужно, ибо от извращенцев защиту делать просто глупо) 3. Работа с дефайнами ничем не отличается от работы с константами, за исключением того, что они создают меньше проблем (объяви в хэдэре "мама", попробуй скомпилировать, а потом наслаждайся общением с extern) |
|
18.12.2011, 22:52 | #27 | ||||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
попробуйте заменить константы вида Код:
Цитата:
так как строковые константы обьявляют память, то они должны быть в cpp файле, а в .h обьявление с extern. дефайн же в каждой единице трансляции выделяет память, если строка маленькая то фиг с ним, а если приличного размера? Цитата:
этот код вылетит Код:
Цитата:
Цитата:
Цитата:
стоит знать как идет процесс компиляции С++ кода, а какое место занимает препроцессинг в нем. а именно препроцессинг идет до стадии компиляции, препроцессинг просто заменяет код, не капли не анализуя его. в итоге компилятор не знает о том что было сделано. PS: ну это ваше дело, я уже видел все эти грабли, и наступал на них. повторять чужие ошибки или нет, это дело ваше. PPS: не спроста же я отказался от препроцессора в своем ЯП. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 18.12.2011 в 22:56. |
||||||
18.12.2011, 22:54 | #28 | |
Great Code Monkey
Форумчанин
Регистрация: 09.08.2007
Сообщений: 533
|
Помимо огромного косяка с областью видимости и еще нескольких менее важных особенностей, у дефайнов есть еще один недостаток - в различных сообщениях компилятора мы можем получать магические числа, магические строки и прочую уличную магию из-за отсутствия имени константы в таблице символов.
Цитата:
const char* T="мама"; Мда... И это то константа? const char* const T - вот константа. Поэтому ярые любители дефайнов никогда не закоммитят ничего в большой проект - код просто не будет проходить ревью. PS препроцессор иногда очень полезен, не стоит слишком категорично его ругать) Последний раз редактировалось still_alive; 18.12.2011 в 22:57. |
|
18.12.2011, 23:28 | #29 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
19.12.2011, 00:02 | #30 | |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
Цитата:
У нас в требованиях к написанию кода об этом сказано
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как проще ее написать? | 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 |