170 похожих чатов

Уф, с чего бы начать. Есть макрос, который дефайнит функцию_1 и

статическую переменную, эта переменная является классом, которая дергает другую функцию_2, и функция_2 закидывает указатель на функцию_1 в статический вектор.

И этот вектор уже можно будет получить по ходу выполнения программы.

Проблема в следующем. этот статичесий вектор и все функции, что в него закидывают указатели на другие функции вынесены в статическую либу, engine.lib

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

Но если юзать в сорсах, к примеру, экзешника, к которому линкуется та самая engine.lib, то указатели на функцию не попадают в вектор.

Что с этим можно делать и в какую сторону гуглить?

скидываю код макроса и объекта, который вызывает функцию add_entry(func); которая закидывает указатель в вектор.

Надеюсь понятна суть проблемы. Надеюсь на вашу помощь. Если что-то еще надо говорите.

https://pastebin.com/fbLM0wJr

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

8 ответов

39 просмотров

в чем суть извращений с макросами? почему внутри функции нельзя просто вызвать add_entry(me) ?

Кажется в MSVS в рамках одного решения это исправляется настройкой https://docs.microsoft.com/en-us/cpp/build/reference/linker-property-pages?view=msvc-160#use-library-dependency-inputs если я правильно понял проблему

мыши
в чем суть извращений с макросами? почему внутри ф...

Скорее в экономии сил. Проще энное количество раз написать одну строчку, чем явно прописывать столько же одинаковых функций

Georgy Firsov
Скорее в экономии сил. Проще энное количество раз ...

дивные запросы возникают однако. =) мне кажется, создаваемый экземпляр 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Тоесть ничего не выбрасывается.

Александр
Не выкидывает. Если добавить print в функцию, кото...

В add_entry можно добавить вывод &entries и убедиться, что вектора будут разные

Александр- Автор вопроса
Alexander Karaev
В add_entry можно добавить вывод &entries и убедит...

Ты проглядел, это и сделано std::cout << (size_t)&entries << std::endl;

Александр
Ты проглядел, это и сделано std::cout << (size_t)&...

Действительно. Я по ошибке увидел, что выводится адрес функции

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта