Как получить имена методов и параметров внутри файла C в Java?

Microsoft Enterprise Library (ссылка на .NetTiers) была нашей проблемой, которая, в свою очередь, ссылалась на более старую версию Unity. Чтобы решить проблему, мы использовали следующее переадресацию привязки в файле web.config:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.414.0" newVersion="2.1.505.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Practices.Unity.Configuration" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.414.0" newVersion="2.1.505.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

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

0
задан Lauren Van Sloun 27 February 2019 в 03:37
поделиться

2 ответа

Как уже упоминалось, вам нужен синтаксический анализатор C для Java - посмотрите на этот ответ: Проект Eclipse CDT

0
ответ дан Markus Fried 27 February 2019 в 03:37
поделиться

У вас есть несколько подходов:

  • Поскольку на него уже ответили комментарии @ user3386109 в комментариях к вопросу, вы можете отсканировать исходный файл и извлечь названия включенных функций. Это требует предварительной обработки файла (с помощью cpp(1)), поскольку фактические имена функций могут быть скрыты в конструкциях макросов, а затем извлекаются имена определений функций (для этого потребуется синтаксический анализатор или нет, в зависимости от ограничений, накладываемых на источник файл, который вы хотите отсканировать). В любом случае, это будет сложная задача, и чем больше вы будете ограничивать формат в исходном файле.
  • Вы можете dlopen(3) объектный файл (участвующая программа или совместно используемая библиотека) и искать идентификаторы функций. Это также будет утомительно, поскольку вынуждает вас использовать двоичный формат (в основном, ELF), который будет использоваться в качестве целевой архитектуры вашей программы. Это зависит от исполняемого формата и не всегда будет возможно.
  • Более простой подход состоит в том, чтобы пометить эти идентификаторы в источнике (например, аннотации в java) макросом TAG, который расширяется до нуля, и отметить места, где будет происходить идентификатор функции. Например:

    #define TAG
    void TAG myFunc(int a, int b, int c)
    

    Затем вы можете найти файл для TAG и извлечь следующий идентификатор.

Язык Java требует, чтобы идентификаторы были включены в исполняемый файл в строковом формате, поэтому вы можете применить самоанализ для получения этой информации, но это не является обязательным требованием в C / C ++. И вся структура иерархии классов также включена в исполняемый файл как статическая структура данных, так что вы можете перемещаться и открывать все иерархии типов Java. Это невозможно в C, поскольку основной целью программирования на C является эффективность. Наличие всей информации о типе, включенной в программу, вынуждает использовать много памяти для описания определений данных, и поэтому она не включена в C / C ++.

В любом случае, вы можете самостоятельно составить список с идентификаторами имен, которые вы физически видите в файлах, так что, вероятно, вам даже не нужно автоматически обрабатывать ваши файлы во время сборки.

Другой простой подход к автоматическому выполнению того, о чем вы просите, - определить макрос:

#define FUNCTION_NAME(typ, name) char name##_string[] = #name; typ name

и использовать его как

FUNCTION_NAME(void, myFunc)(int par1, char *par2, int par3)
{
    ...
}

, который расширяется до

char myFunc_string[] = "myFunc";
void myFunc(int par1, char *par2, int par3)
{
    ...
}

, поэтому для каждой функции x у вас будет статическая строка x_string с именем в виде строки и заголовком функции, свободным от объявления того, что вы хотите (даже переменная функция)

Кстати, внутри тела функции определен неявный макрос, который расширяется до строки, содержащей имя функции __func__. Но проблема в том, что его можно использовать только внутри функционального тела.

0
ответ дан Luis Colorado 27 February 2019 в 03:37
поделиться
Другие вопросы по тегам:

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