Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как скрыть исходник из компиляции / 20 сообщений из 20, страница 1 из 1
17.02.2016, 14:37
    #39173209
Nikolay Kormushkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Доброго времени суток, всем заинтересованным.
Ситуация следующая, имеется модуль в программе, который необходимо из неё исключить для того чтобы сделать дистриб приложения без этого функционала. Исключать решил с использованием условной директивы препроцессора #if..#endif в исходниках относящихся к этому модулю завязав на значение константы объявленной через #define.

В итоге я добавил файл ConsistsModule.h в котором описал одну единственную константу:
Код: plaintext
1.
 #define WITHMODULE false



Далее подключаю его в заголовочном файле одного из исходников проекта, назовём его условно source1.
И так имею тело source1.h:
Код: plaintext
1.
2.
3.
4.
5.
6.
#ifndef source1H
#define source1H
#include ConsistsModule.h
#if WITHMODULE // Условия на компиляцию модуля
... // тело модуля
#endif



Но тело реализации начинается вот с такого кода (source1.cpp):
Код: plaintext
1.
2.
3.
#include <vcl.h>
#pragma hdrstop
#include "source1.h"



Т.е. я свою условную директиву смогу использовать только после того как подключено
Код: plaintext
1.
#include "source1.h

, а хотелось-бы обрамить весь исходник в тело этой условной директивы, вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
#if WITHMODULE // Условия на компиляцию модуля
#include <vcl.h>
#pragma hdrstop
#include "source1.h"
... // тело модуля
#endif



Но для того чтобы так сделать мне следует перед этим включить
Код: plaintext
1.
#include ConsistsModule.h

, что влечёт за собой включение ConsistsModule.h в source1.cpp тогда когда он уже включён в source1.h - двойной #include получается.

Выход напрашивается в переносе в source1.cpp подключения #include source1.h выше чем
Код: plaintext
1.
2.
#include <vcl.h>
#pragma hdrstop



т.е. вместо текущего кода начала исходника source1.cpp:
Код: plaintext
1.
2.
3.
#include <vcl.h>
#pragma hdrstop
#include "source1.h"



сделать вот так:
#include "source1.h"
#if WITHMODULE // Условия на компиляцию модуля
#include <vcl.h>
#pragma hdrstop
... // тело модуля
#endif

Отсюда вопрос - корректно-ли решение которое я представил, и чем это сулит, т.к. я по сути подставил "source1.h" и <vcl.h> под область действия #pragma hdrstop? Плохо понимаю, работу #pragma hdrstop, отсюда скорее этот вопрос и возник, т.к. не понимаю, что произойдёт после такой переделки.
Ну и может подскажите как ещё можно исключать исходники из проекта, отличным от моего метода способом?
...
Рейтинг: 0 / 0
17.02.2016, 15:12
    #39173252
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Не понятен смысл всех этих телодвижений.

Лишний include, да еще включенный в предкомпилед headers ни время компиляции, ни размер результата особо не поменяет. IMHO & AFAIK
...
Рейтинг: 0 / 0
17.02.2016, 16:03
    #39173319
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay Kormushkin... что влечёт за собой включение ConsistsModule.h в source1.cpp тогда когда он уже включён в source1.h - двойной #include получается.
чтобы этого не было, пиши первой строкой каждого .h
Код: plaintext
1.
#pragma once


тогда включится только при первом упоминании, при последующих компилятор его проигнорирует.
...
Рейтинг: 0 / 0
17.02.2016, 17:18
    #39173389
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay Kormushkinкорректно-ли решение которое я представил, и чем это сулит
В общем случае решение некорректно и приведёт к ошибкам линковки для функций, вызываемых
из других модулей. Обычно функционал из демо-версии выпиливают гораздо более точечно,
заменяя на вывод сообщения, что "данный функционал недоступен" в конкретных обработчиках
конкретных кнопок и пунктов меню.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.02.2016, 06:18
    #39173710
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
А в Борланде есть что-то типа настроек проекта?
В студии можно указать в свойства проекта предефайны и вообще настроить профили сборки, куда включать-выключать (не)нужные файлы.
...
Рейтинг: 0 / 0
18.02.2016, 10:58
    #39173870
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Дедский сат, штаныналямках, а не топик.
...
Рейтинг: 0 / 0
18.02.2016, 12:46
    #39174003
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
MasterZiv,

Погромистами не рождаются сразу! :)
...
Рейтинг: 0 / 0
18.02.2016, 15:28
    #39174358
Nikolay Kormushkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
MasterZivДедский сат, штаныналямках, а не топик.
Очень рад, что для Вас - это детский сад, только пользы от этого мало.

Спасибо, всем откликнувшимся, назрел ещё один вопрос по #include-ам:
Если в source1.h я добавил
Код: plaintext
1.
#include ConsistsModule.h

, далее в source1.cpp добавил
Код: plaintext
1.
#include source2.h

, а в source2.h соответственно также добавлен
Код: plaintext
1.
#include ConsistsModule.h

, то будет-ли конфликт при линковке?
...
Рейтинг: 0 / 0
18.02.2016, 15:37
    #39174380
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay KormushkinMasterZivДедский сат, штаныналямках, а не топик.
Очень рад, что для Вас - это детский сад, только пользы от этого мало.

Спасибо, всем откликнувшимся, назрел ещё один вопрос по #include-ам:
Если в source1.h я добавил..... то будет-ли конфликт при линковке?
Линковка - процесс увязывания бинарного кода (и ресурсов). Конфликт - если у тебя в двух и более местах есть бинарный код с одним именем.
...
Рейтинг: 0 / 0
18.02.2016, 15:53
    #39174417
Nikolay Kormushkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
SiemarglNikolay Kormushkinпропущено...
...то будет-ли конфликт при линковке?
Линковка - процесс увязывания бинарного кода (и ресурсов). Конфликт - если у тебя в двух и более местах есть бинарный код с одним именем.
Не воспринял, к сожалению, ответ применительно к примеру, будут-ли в этом случае бинарный код с одинаковым именем или нет, видимо потому, что плохо представляю себе процесс build-а и возможно, что использование слова "линковка" было тут лишним.
Перефразирую наверно вопрос, на такой:
Допустимо-ли так делать, как в приведённом примере, не вызовет-ли это ошибок при компиляции программы?
...
Рейтинг: 0 / 0
18.02.2016, 16:56
    #39174525
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay KormushkinДопустимо-ли так делать, как в приведённом примере, не вызовет-ли это ошибок при компиляции программы?если файл ConsistsModule.h защищён от двойного включения, то проблем не будет, если не защищён - будет куча непонятных ошибок.
...
Рейтинг: 0 / 0
18.02.2016, 17:00
    #39174530
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay KormushkinВыход напрашивается в переносе в source1.cpp подключения #include source1.h выше чем
Код: plaintext
1.
2.
#include <vcl.h>
#pragma hdrstop

это не нужно, спокойно можно после прагмы писать свой #include "ConsistsModule.h" и далее по тексту. Ничего страшного не случится.
...
Рейтинг: 0 / 0
18.02.2016, 17:05
    #39174539
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay KormushkinПлохо понимаю, работу #pragma hdrstopэто - предварительно откомпилированные заголовки
...
Рейтинг: 0 / 0
18.02.2016, 17:07
    #39174542
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
CEMbMasterZiv,

Погромистами не рождаются сразу! :)

Согласен, программистами становятся после прочтения много-много книжек по программированию.
...
Рейтинг: 0 / 0
18.02.2016, 17:08
    #39174547
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Уже писал 18830516
пиши первой строкой каждого .h
Код: plaintext
1.
#pragma once


и никаких проблем со вложенностью .h не будет.

Тут нет ничего сложного в понимании. Перед компиляцией запускается препроцессор, который заменяет все #include на содержимое файлов.
#include <my.h> означает вставить текст из файла my.h в это место. Если внутри my.h написано #include <my2.h> то туда вставится содержимое my2.h и т.д. пока все #include не исчезнут. Затем начинается компиляция.

Чтобы содержимое my.h не вставилось несколько раз - напиши в нем #pragma once, это команда препроцессору вставлять содержимое только один раз, повторные #include <my.h> он проигнорирует.

PS проверить просто, напиши дважды, если перестанет компилироваться - исправляй.
Код: plaintext
1.
2.
#include ConsistsModule.h
#include ConsistsModule.h
...
Рейтинг: 0 / 0
19.02.2016, 00:59
    #39174857
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
а опцию компиляции -DWITHMODULE=false использовать не судьба?
...
Рейтинг: 0 / 0
19.02.2016, 06:04
    #39174882
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay Kormushkin, а в source2.h соответственно также добавлен #include ConsistsModule.hПо возможности надо избегать вставки хедеров в хедеры, лучше всё вставлять в cpp, где требуется. Хедеры должны быть максимально независимыми.

MasterZivмного-много книжек по программированиюи много-много практического применения
...
Рейтинг: 0 / 0
19.02.2016, 12:57
    #39175197
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
CEMbПо возможности надо избегать вставки хедеров в хедеры, лучше всё вставлять в
cpp, где требуется.
А потом начинается забавная игра "угадай в каком порядке и какие заголовки надо включить,
чтобы эта хрень таки скомпилировалась", ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.02.2016, 12:58
    #39175203
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Dimitry SibiryakovCEMbПо возможности надо избегать вставки хедеров в хедеры, лучше всё вставлять в
cpp, где требуется.
А потом начинается забавная игра "угадай в каком порядке и какие заголовки надо включить,
чтобы эта хрень таки скомпилировалась", ага...


Да нет, он правильно сказал.
...
Рейтинг: 0 / 0
20.02.2016, 01:13
    #39175716
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скрыть исходник из компиляции
Nikolay Kormushkin,


проще всего сделать отдельный исходный модуль и просто на уровне системы сборки компилировать его или нет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как скрыть исходник из компиляции / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]