статическую переменную, эта переменная является классом, которая дергает другую функцию_2, и функция_2 закидывает указатель на функцию_1 в статический вектор.
И этот вектор уже можно будет получить по ходу выполнения программы.
Проблема в следующем. этот статичесий вектор и все функции, что в него закидывают указатели на другие функции вынесены в статическую либу, engine.lib
И если использовать макрос в исходниках этой либы, то все норм, в вектор попадают все указатели.
Но если юзать в сорсах, к примеру, экзешника, к которому линкуется та самая engine.lib, то указатели на функцию не попадают в вектор.
Что с этим можно делать и в какую сторону гуглить?
скидываю код макроса и объекта, который вызывает функцию add_entry(func); которая закидывает указатель в вектор.
Надеюсь понятна суть проблемы. Надеюсь на вашу помощь. Если что-то еще надо говорите.
https://pastebin.com/fbLM0wJr
А вообще, добиваюсь того, что бы можно было макросом определить функцию в каком-нибудь из исходников, и указатели на эти функции можно было получить по ходу выполнения программы и, собственной, вызвать их.
в чем суть извращений с макросами? почему внутри функции нельзя просто вызвать add_entry(me) ?
Кажется в MSVS в рамках одного решения это исправляется настройкой https://docs.microsoft.com/en-us/cpp/build/reference/linker-property-pages?view=msvc-160#use-library-dependency-inputs если я правильно понял проблему
Скорее в экономии сил. Проще энное количество раз написать одну строчку, чем явно прописывать столько же одинаковых функций
дивные запросы возникают однако. =) мне кажется, создаваемый экземпляр static const ::engine::EntryAdder который более нигде не используется, компилятор волен выкинуть во имя оптимизации
Не выкидывает. Если добавить print в функцию, которая засовывает поинтеры в вектор, то видно, что она вызывается дважды. Но по итогу, в векторе оказывается только один поинтер. Это функция из entry_point.cpp, который является частью engine.lib static std::vector<EntryFunction> entries; void add_entry(EntryFunction entry) { std::cout << (size_t)&entries << std::endl; entries.push_back(entry); }; А это main, который является частью экзешника к которому линкуется engine.lib int main() { std::cout << "Hello World" << std::endl; std::cout << engine::get_entries_size() << std::endl; } Вывод следующий 5367501200 5367501200 Hello World 1Тоесть ничего не выбрасывается.
В add_entry можно добавить вывод &entries и убедиться, что вектора будут разные
Ты проглядел, это и сделано std::cout << (size_t)&entries << std::endl;
Действительно. Я по ошибке увидел, что выводится адрес функции
Обсуждают сегодня