Можно ли проверить, существует ли функция со строкой в ​​качестве имени? (C ++) - PullRequest
3 голосов
/ 18 августа 2011

Я хочу иметь возможность сделать что-то вроде этого:

if (Is_Function("helloworld")
    // Run code

Ответы [ 4 ]

7 голосов
/ 18 августа 2011

Простой ответ: нет

Сложный ответ: да, если включены символы отладки, и вы пишете некоторые вспомогательные функции для просмотра символов отладки.Но это действительно ужасно, глючит (функции могут быть автоматически встроены и будут волшебным образом отсутствовать в вашей таблице символов), и больше всего перестает работать, как только вы соберете релизную версию программы.

Окончательный ответ: нет

3 голосов
/ 18 августа 2011

Не в обычном смысле, поскольку C ++ не поддерживает рефлексию.Вы можете скомпилировать программу с отладочной информацией и открыть ее и прочитать таблицу символов, как отладчик, но это, вероятно, больше проблем, чем стоит.

В любом случае, зачем вам нужно обнаруживать существование функцииво время выполнения?Это известно во время компиляции.

Если вы можете выделить часть, которая может содержать функцию, в динамическую библиотеку, вы можете открыть ее во время выполнения и выполнить поиск по ней по символам.(В системе Linux вы бы использовали dlopen() и dlsym(); на других платформах есть эквиваленты, но я не знаю их имен от случая к случаю.) Это скажет вам, существует ли имя как символ, хотя оно и выиграло 'не могу сказать вам, является ли это функцией.

2 голосов
/ 18 августа 2011

Одна из техник, которую вы можете использовать в системах на основе ELF (Linux и большинство вариантов Unix, включая MacOS X), - это связать с -rdynamic, а затем вызвать dlsym(RTLD_DEFAULT, "helloworld"), чтобы получить указатель на функцию helloworld, еслион существует в текущем исполняемом файле или любой общей загруженной библиотеке.Это имеет проблемы с C ++ из-за искажения имени, поэтому на самом деле работает только для функций, объявленных с extern "C" или в коде C.

0 голосов
/ 18 августа 2011

Что ж, Qt делает что-то подобное при использовании сигналов и слотов, но тогда функции будут зарегистрированы на карте, проиндексированной путем искажения их имени iirc.Эта регистрация достигается с помощью «MetaObject Compiler», который в основном является препроцессором / генератором кода и работает статически.

В зависимости от того, что вы хотите сделать, вы можете использовать Qt.

Другая возможность будеткомпилировать разделяемую библиотеку и использовать dlsym, если она доступна в вашей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...