Почему имя enum добавляется в качестве префикса к моим константам, когда отображается как объект Active X в VEE? - PullRequest
0 голосов
/ 20 февраля 2012

Я использую перечисление, объявленное в том же пространстве имен, что и один из моих интерфейсов COM в C #.

Когда я просматриваю перечисление в обозревателе функций и объектов в Hyper Vee, перечисление перечисляется ниже интерфейса COM, но для всех констант внутри него в качестве префикса добавлено имя enum.

ex: Enum = enumname   Const = enumname_constantname where i want the Const to be only = constantname

Я не видел этого раньше в VEE, кто-нибудь знает, почему это так?Я объявил что-то не так в своем коде C #?

 public enum EnumName
{
constantName1, 
constantName2
};

public interface InterfaceName
    {
    }

В результате константы, отображаемые в VEE, отображаются как EnumName_constantName1 и т. Д ...

1 Ответ

3 голосов
/ 20 февраля 2012

Нет, это вызвано значительной несовместимостью между типами перечисления .NET и ключевым словом enum в таких языках, как C и C ++.Эти языки добавляют членов перечисления в глобальное пространство имен.Что на самом деле является большой проблемой, часто заставляет вас добавлять префиксы к именам членов перечисления, чтобы они не конфликтовали с другими идентификаторами.Как и «константа», как вы использовали в своем фрагменте.

Недавно утвержденный новый стандарт языка C ++ (C ++ 11) на самом деле имеет исправление этой проблемы с новым ключевым словом enum class ,Который работает так же, как перечисления .NET, они должны иметь префикс с именем типа enum.По совпадению также тот же синтаксис, который использовался в C ++ / CLI 6 лет назад.Вероятно, это не случайность.

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

Но посмотрите на яркую сторону, вам больше не нужно использовать этот уродливый «постоянный» префикс.Код клиента теперь может использовать «EnumName_Name1».Если вам действительно нужно это исправить, вы можете декомпилировать библиотеку типов в .idl с помощью программы oleview.exe.Отредактируйте typedef и скомпилируйте его обратно в .tlb с помощью midl.exe.В противном случае это болезненно.

...