Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Програмно определить включение модуля в сборку 
:(
    Опции темы
semibug
Дата 19.6.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Вопрос такой.
Какими способами можно определить в программе был ли включен в компиляцию и линковку определенный модуль.
Т.е. например при запуске программа выводит в консоль сообщение, о том что один из модулей с исходным кодом не включен в сборку.
PM   Вверх
mes
Дата 19.6.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



можно определить define для каждого модуля




--------------------
PM MAIL WWW   Вверх
Alek86
Дата 19.6.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(mes @  19.6.2009,  10:23 Найти цитируемый пост)
можно определить define для каждого модуля

и что это даст? дефайн же доступен только внутри того модуля


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 19.6.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alek86 @  19.6.2009,  11:01 Найти цитируемый пост)
и что это даст? дефайн же доступен только внутри того модуля 

кажется опять неправильно понял вопрос.

исправляюсь :
можно завести класс Модуль со статическим хранением списка всех созданных объектов и в каждом модуле определить такой объект,
тогда из main можно будет получить доступ к этому списку.
сейчас дам примерчик.




--------------------
PM MAIL WWW   Вверх
mes
Дата 19.6.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Код

// module.h

#pragma once
#include <iostream>
#include <vector>
#include <string>

class Module
{
       static std::vector<Module*>& Objects () { static std::vector<Module*> m_objects; return m_objects; }
    public:
      static std::vector<Module*> const& GetObjects () { return Objects(); }

      Module (const std::string& name) : m_Name(name) { Objects().push_back(this); }
      std::string Name() const { return m_Name; }

    private:
        std::string m_Name;

};


Код

//cpp1.cpp
#include "module.h"
static Module module("cpp1.cpp");

// cpp2.cpp
#include "module.h"
static Module module("cpp2.cpp");

...


Код

//main.cpp
#include <iostream>

#include "module.h"
static Module module("main.cpp");


int main(int argc, const char** argv) {

for (std::vector<Module*>::const_iterator it = Module::GetObjects().begin(); it != Module::GetObjects().end(); ++it)
{
    std::cout << "=> "<< (*it)->Name()<<std::endl;

};

    return 0;
}

P.S. пример показательный, чего не хватает (деструктора, тайпдефоф и т.д) добавить по вкусу. smile


Это сообщение отредактировал(а) mes - 19.6.2009, 13:44


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 19.6.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



дубль

Это сообщение отредактировал(а) Леопольд - 19.6.2009, 13:44


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.6.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



создайте приведенный примерчик, посмотрите результат, а потом из списка компиляции удалите например файл cpp1.cpp и сравните результат с первоначальным smile



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 19.6.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Вопрос непонятен. Нельзя поподробнее? Особенно поможет конкретный пример, для чего это надо.

Ещё мне кажется что не обязательно дожидаться запуска программы, уверен можно сделать статическую проверку в случае которой препроцессор/линковщик выдаст вполне осмысленную ошибку в виде имени класса, всё зависит от того что именно надо.

Это сообщение отредактировал(а) Леопольд - 19.6.2009, 13:47


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.6.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  19.6.2009,  12:44 Найти цитируемый пост)

Ещё мне кажется что не обязательно дожидаться запуска программы, уверен можно сделать статическую проверку в случае которой препроцессор выдаст вполне осмысленную ошибку в виде имени класса, например.

так в том то и дело, что проект вполне работоспособный без этого модуля, однако в главной части программы хочется знать какие модули присутствуют в теле программы. 
 smile 



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 19.6.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(mes @ 19.6.2009,  13:46)
Цитата(Леопольд @  19.6.2009,  12:44 Найти цитируемый пост)

Ещё мне кажется что не обязательно дожидаться запуска программы, уверен можно сделать статическую проверку в случае которой препроцессор выдаст вполне осмысленную ошибку в виде имени класса, например.

так в том то и дело, что проект вполне работоспособный без этого модуля, однако в главной части программы хочется знать какие модули присутствуют в теле программы. 
 smile

Я понимаю что он работоспособный, иначе это бессмысленно. Просто я говорю что эту задачу наверняка можно решить статически. smile Мне сейчас некогда думать как. Увы, надо работать...


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.6.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  19.6.2009,  12:50 Найти цитируемый пост)
Я понимаю что он работоспособный, иначе это бессмысленно. Просто я говорю что эту задачу наверняка можно решить статически. smile Мне сейчас некогда думать как. Увы, надо работать... 

Если из  при компиляции из исходного кода нужно управлять, какие модули подключить, какие нет, то поможет препроцессор - я первоначально подумал, что речь идет как раз об этом когда советовал про define.

Но Alek86, обратил внимание, что речь идет о несколько другом, а именно :
Из главного модуля нужно узнать какие модули к нему прилинковали. 
Это на уровне компиляции невозможно, так как линковка происходит "задолго" после компиляции, и в данном случае поможет только динамическая регистрация модулей.

Это сообщение отредактировал(а) mes - 19.6.2009, 14:14


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 19.6.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(mes @ 19.6.2009,  14:14)
...
Это на уровне компиляции невозможно, так как линковка происходит "задолго" после компиляции, и в данном случае поможет только динамическая регистрация модулей.

Не спорю, препроцессор в этом не поможет. Но можно попытаться спровоцировать обшибку компоновки.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.6.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  19.6.2009,  13:45 Найти цитируемый пост)
Не спорю, препроцессор в этом не поможет. Но можно попытаться спровоцировать обшибку компоновки. 

Так зачем провоцировать ошибку, если человек хочет получить готовую работающую прогрaмму с определенным набором модулей ?

хотя спровоциовать ошибку  и не трудно, но в задачу это, имхо, не входит :
Цитата(semibug @  19.6.2009,  09:01 Найти цитируемый пост)
Т.е. например при запуске программа выводит в консоль сообщение, о том что один из модулей с исходным кодом не включен в сборку. 



Это сообщение отредактировал(а) mes - 19.6.2009, 14:55


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 19.6.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Вот потому я его и спросил. Зачем ему это надо? smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.6.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  19.6.2009,  14:03 Найти цитируемый пост)
Вот потому я его и спросил. Зачем ему это надо? smile 

можно рассматривать как программу со статически подключаемыми плагинами.


Это сообщение отредактировал(а) mes - 19.6.2009, 15:36


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.