|
Заблокирован
|
|||||||||||
препроцессор с++02.09.2011, 19:59. Показов 6248. Ответов 47
Метки нет (Все метки)
Задача:
Сделать так, что бы при определённом условии класс "знал" что его тестируют в консоли, и выводил в неё всю необходимую служебную информацию. В режиме же реальной работы, даже сам код вывода данных в консоль не должен быть скомпилированным. Возникшая сложность: В случаи, если режим работы - тестирование классов, то требуется выполнить некоторую предварительную подготовку приложения к работе. Другими словами - запустить на выполнение некий набор функций. Вопрос: Можно ли так сделать, что бы в случае, если идентификатор (#define) определён - при компиляции будут запущены и выполнены некоторые дополнительные функции? Один из вариантов ответа: Ниже представлен полностью рабочий код. В нём мне удалось реализовать задачу, озвученную выше. Однако, удалось это сделать только при помощи глобального объекта. Меня же интересует, можно ли это сделать как нибудь так, что бы обойтись без глобальных объектов? А так же, к каким проблемам может привести ниже представленный код. Критика кода приветствуется.
Он объявляется, и определяется в глобальном пространстве. Код, выполняемый в его конструкторе - это и есть тот кусок кода, которые запустится в случае, если дефайн будит определён. 1. К каким проблемам могут привести макросы? 2. К каким проблемам может привести создание глобального объекта? 3. Есть ли другие способы добиться аналогичного эффекта, но при этом, вообще не создавая глобальных объектов? 4. Как сделать макросы кросс-платформенными? В частности, нужно избавиться от windows.h в случае, если компилируемый код - не под ос виндовс. Но тогда объект GlobalRun ругнется на незнание функций консоли... Добавлено через 11 минут /зы в строке 75 - опечатка
0
|
|||||||||||
| 02.09.2011, 19:59 | |
|
Ответы с готовыми решениями:
47
препроцессор, #if Препроцессор
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
| 03.09.2011, 10:01 | |
|
Может быть, шаблоны, специализация и принцип SFINAE "спасут отца русской демократии"?
И у Александреску, и в справочнике по шаблонам написаны compile-time функции с использованием шаблонов. Например, для того, чтобы в compile-time выяснить, есть ли в классе некий метод.
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 03.09.2011, 10:03 | ||
|
0
|
||
|
Заблокирован
|
|
| 03.09.2011, 14:35 [ТС] | |
|
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 03.09.2011, 14:55 | ||
|
0
|
||
|
|
||
| 03.09.2011, 15:00 | ||
|
SFINAE можно применять не только к шаблонным типам. сам по себе SFINAE - шаблон.
а как я понял это - второе - SFINAE невозможно применить к не_специализированному_шаблону. а из этого следует, что в данном контексте, шаблон уже таковым не является. что равносильно не шаблонному типу.
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 03.09.2011, 15:04 | |
|
Я имел в виду, что тип нужно передавать в качестве параметра шаблона.
Впрочем, мне эту идиому использовать пока не приходилось, поэтому я вообще не вкурсях.)
0
|
|
|
Заблокирован
|
|||||||
| 03.09.2011, 15:28 [ТС] | |||||||
|
То бишь, некий хэдер (плюс набор управляющих дефайнов) выступают в роли этакой стратегии компиляции. Однако, предварительная подготовка может потребовать запуска некого набора функций (например, настройка кодировки для консоли). Но нельзя запускать код на выполнение до точки входа в программу (до main() ) Обходной путь - создание глобальных объектов. Они при инициализации в глобальном пространстве могут запускать в своих конструкторах любые функции, и по сути эти функции выполнятся ещё до точки main() Меня интересует, если ли какой нибудь способ, что бы сделать тоже самое, но без глобал объектов? А так же, если для этой цели использовать глобальные объекты, не приведёт ли это к каким либо проблемам? Я слышал что-то типа того, что инициализация объекта в хэдере - это мина замедленного действия. Поэтому и обеспокоился. Ещё один способ запуска функции до точки main()
Профит: Построить указатель дешевле, чем сам объект. А функция, которая будит передана в конструктор указателя может быть самой обычной функцией. Таким образом, будит создан всего лишь один нигде не используемый глобальный указатель. Есть даже вероятность, что оптимизирующий компилятор и вовсе - выбросит этот момент инициализации из целевого кода, и тогда все подготовки пойдут прахом. Но... эксперимент показывает, что вроде бы пока все работает))
0
|
|||||||
|
|
||||
| 03.09.2011, 15:45 | ||||
|
меньше не получилось
![]() сейчас прочту... Добавлено через 8 минут
0
|
||||
|
Заблокирован
|
||
| 03.09.2011, 16:05 [ТС] | ||
|
А вместо GetInstance() может быть любая функция, не обязательно классовый статик. Способ подготовиловки такой: в хэдере прописываются функции, которые потенциально могут понадобится. Дальше за дело принимается препроцессор - он выбирает нужную линию компиляции. На каждой такой линии инициализируется глобальный указатель, с помощью которого запускается нужный пакет "предварительных функций" Методы классов, и их аспективная начинка (логи всякие, внутренние проверки, и тп) - все это оборачивается в макросы типа TEST, что должно гарантировать: когда, какие, и при каких условиях методы будут скомпилированы, а какие - нет. Задача этих методов - инспектировать внутреннею работу класса, выявлять ошибки, которые невозможно выявить на этапе компиляции. Ошибки компиляции я предполагаю выявлять по методике Роббинсона (напоминает Александресску) - добавление в приватную зону методов, которые никогда не будут вызваны, а потому и скомпилированы, но будут ругаться на нарушения некоторых контрактов класса. Так же, в процессе разработки класса, я предполагаю разработку дополнительного класса, единственная задача которого - подвергнуть юнит-тестированию целевой класс. Все автоматические юнит-тесты должны произойти ещё до точки main() То бишь, создаётся глобальный указатель, который инициализируется статик-методом класса-тестера. Этот статик метод запускает пакет тестовых функций, которые должны охватить весь интерфейс тестируемого класса, ну и тп. Таким образом, инициализация указателя происходит в хедере, а не в файле спп. И этот момент идеи меня несколько смущает. Ну и напоследок, думаю неплохо было бы предусмотреть режим, когда юнит-тестам подвергается каждый только что созданный объект, с конкретным набором стартовых данных.
0
|
||
|
|
||
| 03.09.2011, 16:11 | ||
|
но потенциальную проблему я вижу в другом - стандарт не дает никаких гарантий на порядок инициализации/разрушения статических переменных, а следовательно, при их множественном кол-ве и взаимном использовании ожидайте UB.
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 03.09.2011, 16:18 | |
|
Если GetInstance геттер синглтона, а указатель создаётся не в хэдэре, а в файле реализации, то проблем быть не должно.
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 03.09.2011, 16:46 | |
|
0
|
|
|
Заблокирован
|
||
| 03.09.2011, 17:05 [ТС] | ||
|
Эм, только сейчас обратил внимание. Похоже я не совсем понимаю о чем идёт речь. Что есть "проверка семантики" и чем она отличается от "полного цикла компиляции" ?
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||||||
| 03.09.2011, 17:10 | |||||||
При этом ошибка в Func2 будет обнаружена в любом случае.
0
|
|||||||
|
Заблокирован
|
||
| 03.09.2011, 17:21 [ТС] | ||
|
Вся идея конструируется на том, что он инициализируется в хэдере. Очень не хочется плодить армию спп для поддержки тестов... Особенно, если речь идёт о тестировании шаблонных классов, которым спп не нужен в принципе.
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 03.09.2011, 17:32 | |
|
С синглтоном может и с хэдэрами проблемы не будет. Но только при условии, что синглтон корректно реализован и все, кто от него зависят обращаются именно через геттер к нему. Ну и указатели лучше static'ами сделать. Тогда у тебя для каждого включения хэдэра будет по одному указателю, инициализированному адресом объекта из синглтона.
Хотя не понимаю, что мешает поместить код проверок (тот же вызов синглтона) первым оператором в main.
0
|
|
| 03.09.2011, 17:32 | |
|
Помогаю со студенческими работами здесь
40
Препроцессор #pragma Почему не работает препроцессор? Препроцессор,исключительные ситуации
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает
Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
|
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-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|