Есть ли способ сгенерировать ошибку компилятора? - PullRequest
3 голосов
/ 22 июля 2010

Я хочу определить тип Nibble.

Я хочу, чтобы, если пользователь установил значение выше 0xf, он должен выдать ошибку компилятора.

Возможно ли это?

Ответы [ 4 ]

1 голос
/ 22 июля 2010

Если в вашей точке USER является DEVELOPER, вы можете сделать это с помощью макроса следующим образом:

#if YOUT_VALUE == 0xf
    #error YOUR_ERROR_MESSAGE
#endif

Но в некоторых средах разработки у вас могут возникнуть проблемы со сравнением в операторе #if, потому что ее функциональные возможности были включены только в неопределенные / неопределенные.

0 голосов
/ 22 июля 2010

Похоже, что самый простой способ достичь желаемого - это поддиапазонный тип.Языки, которые поддерживают типы поддиапазонов, являются почти всеми языками в последовательности преемственности Algol68 (Algol68, Pascal, Modula-2, Oberon, Component Pascal) и их cousings и производные (Turbo Pascal, Borland Pascal, FreePascal, Delphi, Kylix, Object Pascal) а также ада.Я считаю, что вы можете реализовать поддиапазонные типы в C ++, используя некоторые тяжелые шаблоны-фу.Возможно, вы сможете реализовать их на языках с более выразительными системами типов, таких как Scala, Haskell, ML, Agda, Epigram, Guru.

Я понятия не имею, почему некоторые языки не поддерживают поддиапазонные типы.Они, очевидно, полезны, просты в использовании, просты для понимания, просты в реализации.

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

0 голосов
/ 22 июля 2010

Вы можете использовать Enum с атрибутом [Flags]. Таким образом, вы можете использовать побитовые операции над его членами:

[Flags]
enum Nibble
{
_0,
_1,
// ...
_A,
_F,
};

byte b = Nibble._1|Nibble._A;

Вы также можете создать структурный клев с оператором неявного преобразования из int в клев. Но это создаст ошибку времени выполнения, а не ошибку времени компиляции.

Если вы хотите выполнить статическую проверку, взгляните на API контрактов c # 4.0.

0 голосов
/ 22 июля 2010

Нет, это невозможно с компилятором C #.

У него нет препроцессора для проверки постоянных значений, как это может делать препроцессор C / C ++.

Лучшее, что вы можете сделать, этогенерировать исключение во время выполнения.

Редактировать: Вы всегда можете попробовать запустить код C # (с некоторыми незначительными изменениями) через препроцессор C / C ++ и создать директиву #error.

Edit:

Видя, что это не зависит от языка, да, вы можете легко сделать это в любом языке, который поддерживает какое-то расширение макроса или оценку времени компиляции.Например: схема, LISP, C / C ++ и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...