|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.12.2011, 04:31 | #31 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Обнаружил, что компилятор Visual 2008 (в режиме компилирования Си кода) не поддерживает константы:
Код:
Цитата:
Последний раз редактировалось 8Observer8; 19.12.2011 в 07:40. |
|
19.12.2011, 07:16 | #32 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Небольшой экперимент:
//где-то в хэдэре Цитата:
Цитата:
1. Действительно, константный указатель на константу является альтернативой дефайновой константы. И не требует extern 2. Вот этого многие не понимают: нет никакой разницы между дефайном и обычной константой в том смысле, что в той точке, где эта константа используется - она используется ПО ЗНАЧЕНИЮ. Например, у дефайновой литерной константы адрес можно взять так же просто, как и у любой магической литерной константы. Тип данных дефайновой константы определяется по её значению. Получается, что #define PARENT "папа" это эквивалент const char parent[]="папа"; После препроцессинга, все функции, выполняющую проверку типа будут считать что PARENT имеет тип данных const char[5]; А при попытки взять адрес у литерной константы, компилятор сам поместит массив чаров туда, где у него можно будит взять адрес. 3. Этого я сам не понял: почему то он во всех трех случаях вывел один и тот же адрес. Возможно это связанно с тем, что компилятор чего то там оптимизировал... ps Как тут теги нормальные ставить? Что бы у кода форматирование не уезжало? Последний раз редактировалось _Bers; 19.12.2011 в 07:37. |
||
19.12.2011, 08:19 | #33 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
19.12.2011, 08:19 | #34 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
В догонку:
Докажем, что любые функции, при проверке типа воспринимают литерный дефайн, как массив фиксированной длины Вот этого, я сам долгое время не мог понять. Оказывается, на с++ тип данных "массив" и тип данных "указатель" - это два принципиально разных типа. Все дело только в том, что по стандарту компиляторы имеют право неявно преобразовывать первое, ко второму... Но один хороший человек мне это очень просто объяснил: Тезис: два типа данных принципиально различны, если функция принимающая один тип данных - бракует другой. То есть, если один тип проходит проверку, а другой - нет. Значит типы данных различны. Итак, поехали.. где-то в хэдэре Код:
Код:
Последний раз редактировалось _Bers; 19.12.2011 в 08:22. |
19.12.2011, 08:32 | #35 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
хватит зацикливаться на типе дефайна.
у него есть недостатки, и от них не уйти. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
19.12.2011, 08:33 | #36 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
И любые функции, выполняющие проверку типа смогут корректно их обработать. Проверка типа не выполняется только в макросах. Макросы - опасная вещь! Искать ошибку в коде, который толком не видать, даже как разворачивается - проблематично. Это большой минус к практическому использованию, и сопровождению. Дефайны же могут быть опасны, только если в команде присутствует извращенец, который любит объявлять переменные заглавными буквами, и переопределять уже существующие дефайны. Макросы я всегда использую только локально (внутри единицы трансляции). Ни в каких хэдэрах они не фигурируют. Они не предназначены для массового пользователя. И использую я их только с одной целью - улучшить читабельность кода, одновременно сокращая количество писанины. И желательно, что бы об их существовании вообще никто не знал. Инкапсуляция. А вот по поводу литерной константы... я даже и не знал, что её можно без extern юзать. За науку вам всем огромный респект. Буду переходить на константы)) Все таки профита у них побольше будит, чем у дефайна (жаль только студия никак не выделяет цветом глобальные переменные, как дефайны) |
|
19.12.2011, 14:45 | #37 | |||
Great Code Monkey
Форумчанин
Регистрация: 09.08.2007
Сообщений: 533
|
Цитата:
Код:
Цитата:
Цитата:
|
|||
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как проще ее написать? | 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 |