Вопрос
Как вызвать символ с искаженным именем из 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.