Форум программистов, компьютерный форум CyberForum.ru

Указатель на функцию - C++

Восстановить пароль Регистрация
 
i_s_m_mipt
0 / 0 / 0
Регистрация: 26.03.2016
Сообщений: 10
29.03.2016, 13:00     Указатель на функцию #1
Доброго времени суток!
Кто может посоветовать способ присвоить указателю на функцию значение, т.е. имя функции, если мы не будем указывать его явно в коде, а задади имя функции как std::string. Можно, наверное, через ассоциативный контейнер - ключ - имя функции в формате std::string, значение указатель на функцию, вот только функции разные, и придется много map-ов организовывать. Какие есть еще варианты?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2016, 13:00     Указатель на функцию
Посмотрите здесь:

Указатель на указатель на функцию C++
Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? C++
C++ Builder Указатель на функцию
C++ Указатель на функцию
C++ указатель на функцию
Указатель на функцию C++
C++ Указатель на функцию
C++ Указатель на функцию
C++ Указатель на функцию
Указатель на функцию C++
C++ Указатель на функцию возвращающую указатель
C++ Указатель на функцию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
29.03.2016, 13:37     Указатель на функцию #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
i_s_m_mipt, можно использовать платформозависимые функции GetProcAddress (для Win) и dlsym (для *nix), чтобы получить указатель на функцию из собственного процесса (или из другой dll/so).

Естественно, нужные функции должны быть помечены как экспортируемые.
Пример для *nix:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
#include <dlfcn.h>
 
extern "C" void test(char const * text)
{
    std::cout << "hello [" << text << "] world!\n";
}
 
int main()
{
    void * self = ::dlopen(NULL, RTLD_LAZY);
    
    if(self)
    {
        void(*p)(char const *) = (void(*)(char const *))::dlsym(self, "test");
    
        if(p)
        {
            p("check");
        }
        
        ::dlclose(self);
    }
}
Онлайн пример: http://rextester.com/ODB2007 (Clang)

Обрати внимание на ключик -Wl,--export-dynamic. Также в GCC/Clang возможно составить список конкретных функций для экспорта (-Wl,--dynamic-list).


Пример для Win:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
 
extern "C" __declspec(dllexport) void test(char const * text)
{
    std::cout << "hello [" << text << "] world!\n";
}
 
int main()
{
    HINSTANCE self = ::GetModuleHandle(NULL); 
    if(self)
    {
        void(*p)(char const *) = (void(*)(char const *))::GetProcAddress(self, "test");
        
        if(p)
        {
            p("check");
        }
    }
}
Онлайн пример: http://rextester.com/TWK98848 (VC++)

Обрати внимение на __declspec(dllexport), без этого твою функцию GetProcAddress не увидит.
Yandex
Объявления
29.03.2016, 13:37     Указатель на функцию
Ответ Создать тему
Опции темы

Текущее время: 04:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru