Вопрос

Как вызвать символ с искаженным именем из C?

module.name:version

void* function(TypeSig); // Type of the function

Я бы хотел иметь возможность использовать пути к коду, написанные на моем языке на C.Соглашение о вызове функции примерно такое же.Просто я должен изменить версию и путь к модулю внутри символов, которые я экспортирую, и у меня то же соглашение об идентификаторах, что и в C, поэтому я не могу просто использовать подчеркивание.

Это было полезно?

Решение

IIUC, вы определяете свой собственный язык и ищете подходящий алгоритм искажения имен.

Возможно, вы захотите использовать информацию et.al. Алгоритм искажения имен Itanium, который используется g ++ на всех платформах.В конкретном случае вы можете исказить каждое из ваших имен, как если бы объявление C ++ было

namespace module{ namespace name { namespace Vversion /*e.g. V1_0 */ {
  void *function(int){}
}}}

который был бы искажен как

_ZN6module4name4V1_08functionEi

Поскольку все ваши символы используют этот алгоритм, они не могут конфликтовать друг с другом.Они также не могут конфликтовать со стандартной функцией C, вызываемой _ZN6module4name4V1_08functionEi, поскольку все имена, начинающиеся с _Z (или, _UPPERCASE), зарезервированы для реализации (C).Если вам нужна удобная возможность вызова из g ++, вы можете использовать именно это соглашение;в противном случае вы выберете букву, отличную от Z.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top