Пределы идентификатора C

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

module.name:version

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

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

15.12.2008 10:57:24
module.name:version не похоже на C. Можете ли вы пометить его заново?
Johannes Schaub - litb 15.12.2008 16:25:18
1 ОТВЕТ
РЕШЕНИЕ

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

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

2
15.12.2008 13:38:18
Тип идентификатора неинтересен (потому что он всегда один и тот же). Поэтому это чище: _W6module4nameV1. В любом случае, спасибо, что показали это. Там только void* fn(TypeSig)-функции из-за процесса пост-ссылки.
Cheery 15.12.2008 19:45:00