|
|
||||||||||||||||||||||||||||||||||||||||||||||
Технический приём для формирования согласованных данных20.08.2009, 21:46. Показов 5707. Ответов 17
Кому-то может пригодиться
Если нет чёткого представления о том, как работает препроцессирование, то смотрим сюда (про директиву #include) и сюда (про директиву #define) Допустим, нужно сделать две согласованных конструкции
А потому нужно такое решение, чтобы каждый элемент условно задавался одной строкой, чтобы во все места подставились нужные данные. Для этого делаю дополнительный файл. У меня он имеет расширение *.def, но это непринципииально (у gnu'шников он *.def, а потому я тоже так делаю, чтобы как у людей было) В итоге получается такая штука
20
|
||||||||||||||||||||||||||||||||||||||||||||||
| 20.08.2009, 21:46 | |
|
Ответы с готовыми решениями:
17
Использование согласованных транзисторов для смещения Получение данных из javascript'a для формирования POST-запроса
|
|
10 / 10 / 5
Регистрация: 25.03.2009
Сообщений: 65
|
|
| 21.08.2009, 09:16 | |
|
Класно
Интересный трюк с препроцессором. А не знаешь в студии можно просматривать файлы на выходе из препроцессора, ну грубо говоря проверть как препрыессорные директивы отработали. Когда много инклудов легко запутаться и вылавливать ошибку...
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|||||||
| 21.08.2009, 12:24 | |||||||
1
|
|||||||
|
MCSD: APP BUILDER
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
|
||||||
| 21.08.2009, 12:29 | ||||||
|
что мешает сделать проще? Например: ...
или даже так:
1
|
||||||
|
|
|
| 21.08.2009, 12:33 [ТС] | |
|
CheshireCat, Можно перепутать местами два элемента. По количеству будет согласовано, по начинке - нет
Rififi, на Си такого нет. Вернее на современных расширениях это можно сделать. Но проблема остаётся та же самая. Тебе нужно иметь 10 согласованных величин и тебе надо будет править в 10 местах в различных файлах. Особенно это проблемно в чужих исходниках (эти места ещё найти надо). Особенно если нет примитивного статического контроля, о котором написал CheshireCat
0
|
|
|
MCSD: APP BUILDER
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
|
|
| 21.08.2009, 12:38 | |
|
Evg,
Откуда 10 мест, править надо лишь в одном месте - при объявлении карты.
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 21.08.2009, 12:41 | |
|
Вариант, предложенный коллегой Rififi, конечно же, тоже возможен и имеет право на жизнь. В нем только есть неприятный "подводный камень": если сама эта std::map и какая-либо функция, обращающаяся к ней, расположены в разных единицах компиляции, то эффект может быть феерическим (в смысле, может привести к большому "ба-бах!").
0
|
|
|
MCSD: APP BUILDER
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
|
|
| 21.08.2009, 12:43 | |
|
может привести к большому "ба-бах!"
каким образом?
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|||||||
| 21.08.2009, 13:50 | |||||||
|
Вот код, который успешно собирается под MSVC++ 2005 и так же успешно "падает", если определен дефайн DO_BABAH (в constants.h), и успешно работает, если дефайн не определен. Код, конечно, намеренно грубый и упрощенный, но он предназначен именно для того, чтобы проиллюстрировать проблему. Имена файлов именно такие преднамеренно ![]()
0
|
|||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 01.09.2009, 20:58 | ||||||
|
Кстати,для С++ придётся использовать небольшой "костыль",хотя в принципе это не так страшно.После последней переменной перечислимого типа не должно быть запятой,поэтому,похоже,придётся сделать что-то вроде этого:
1
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 02.09.2009, 03:55 | |
|
Есть такая мысль,не знаю,насколько это хорошо или плохо:
Можно в одном файле объявлять все типы данных (всё что нужно)для всех модулей(единиц трансляции),но включением этих данных оперировать в самих файлах .cpp с помощью #define.То есть получим концентрацию данных в одном файле,не теряя модульности,сокрытия данных.
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 02.09.2009, 12:49 | |
|
Брррр! Это еще хуже. Потому что через год-два (а иногда может сложиться и так, что через пять-восемь или больше) программист, которому "по счастливому стечению обстоятельств" придется поддерживать этот код и буквально продираться с боем через весь этот частокол накопленных за многие годы #define'ов, наградит вас весьма разнообразными (и далеко не приятными) эпитетами......
Джон Роббинс писал (хотя не ручаюсь за точность цитаты): "Пишите Ваш код так, как будто тот, кто будет его поддерживать - опасный психопат, знающий, где Вы живете."
2
|
|
| 03.09.2009, 00:56 | |
|
0
|
|
|
|
||||||||
| 28.05.2010, 20:07 [ТС] | ||||||||
|
Волей случая меня опять занесло в эту тему, а потому отвечу на то, что в своё время так и не прочёл
1
|
||||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 28.05.2010, 20:23 | |
|
>На самом деле запятая там допускается. Потому как разработчики изначально понимали, что язык будет работать совместно с препроцессором
Видимо,у меня это не пполучилось из-за опций компиляции Кстати,интересная система комментариев для длинных записей..
0
|
|
|
|
|
| 04.09.2014, 17:49 [ТС] | |
|
Вот альтернативная форма этого же приёма (без дополнительного файла)
Вывести содержимое Enum
0
|
|
| 04.09.2014, 17:49 | |
|
Помогаю со студенческими работами здесь
18
Перенос данных из StringGrid в FastReport в табличном виде, для формирования отчёта Прием данных клиентом TcpClient, данных попадается некорректные значения, почему?
Ребят нужен технический совет по созданию приложения для для вывода ошибок с сервера Программа формирования данных о людях. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|