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

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

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

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

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

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

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

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

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

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

https://pastebin.com/fbLM0wJr

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

8 ответов

15 просмотров

в чем суть извращений с макросами? почему внутри функции нельзя просто вызвать 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)&...

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта