Перейти к содержанию
    

CPP enum с минусовыми значениями

Вопрос касается кода возврата функции, а именно удачно или нет она отработала.

Если плюс - удачно, информация в коде возврата - справочная.

Если минус - критичная ошибка, ф-ия не отработала.

 

(?) Насколько такой подход (с отрицательным enum) правильный-феншуйный-политкорректный ?

 

ps - minus_4 итд приведено для наглядности, в реале - ест-но - там симв. имя ошибки вроде eErr_ADC_Ready

 

А реализовал так:

enum TEnum
{
    minus_4 = -4,
    minus_3,
    minus_2,
    minus_1,
    null_0 = 0,
    plus_1, 
    plus_2, 
    plus_3, 
    plus_4 
} my_enum;

. . .

int MyFun(void) {    ... ... ...   return(minus_2); ..... .... return(plus_3); }

. . . 

RetCode = MyFun();

if( RetCode > 0 )
{
   . . . .  ошибок нет, в RetCode в инф. о статусе выполнения. 
}
else  // минусы и 0
{
   . . . .  разбор ошибок
}

Изменено пользователем k155la3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему бы и нет. Одно не понятно: чем запись minus_4 лучше простой константы -4? Логичнее было бы вместо minus_4 указать наименование типа ошибки.

Константы надо "изобретать" вручную, а меня это утомляет :)

Кроме того с символическими именами которые предоставляет enum работать в миллион раз удобнее чем с цифровыми кодами.

 

ps - пардон, я может неверно сформулировал в примере кода. там minus_4 приведено для наглядности.

в реале - ест-но - там симв. имя ошибки вроде eErr_ADC_Ready

 

Изменено пользователем k155la3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"integer constant expression whose value is representable as a value of type int"

- это в смысле что int по умолчанию signed, соответственно минус можно использовать.

Насколько я понял.

 

По синтаксису компилятор это, естественно, допускает.

 

Интересует "практика" использования отрицательных enum.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . . .

Удобно во вложенных функциях, возвращает тип ошибки на самый верх.

Ok.

 

Я при "транизитном" возврате по ошибке, при каждом выходе "вверх", код ошибки умножаю на 10 - тогда видно с какого уровня

"всплыло". Более правильно наверно, использовать исключения, но пока делаю так.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересует "практика" использования отрицательных enum.

нормальная практика.

более интерено енум использовать с псевдонимами и комбинациями - например объявляеш флаги:

еА = 1, еБ = 2, еВ=4. еХ=0x10

и тут же объявляеш псевдонимы комбинаций

еЧеготоОбычное = еА | еХ

eНеобычное = еБ

еОшибка = еА |еБ |еХ

тожесамое = eНеобычное | еЧеготоОбычное

 

Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро.

Изменено пользователем AlexRayne

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . .

(1) более интерено енум использовать с псевдонимами и комбинациями - например объявляеш флаги

. . .

(2) Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро.

(1) да, допустим определены 10 констант - enum. При этом, если int 16-битный, задействовано только 4 разряда и то не полностью.

Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.

Отрицательные значения - это один из вариантов этого.

 

(2) есть вроде не-дефакто-стандарты на именование различных типов. Тутуж кто-во-что горазд.

A - чтоб мне (любимому) было понятно

B - один из стандартов.

AB или BA приоритет ставят по разному.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(1) да, допустим определены 10 констант - enum. При этом, если int 16-битный, задействовано только 4 разряда и то не полностью.

Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.

да, легкая альтернатива структуре.

Отрицательные значения - это один из вариантов этого.

ну вариант не структуры, просто отрицательные числа используются. и на моей практике - как индикатор ошибки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня другой момент использования енумов занимает - последнее время вижу что народ константы перечисления делает большими буквами, что обычно выглядит как макро.
Ну по смыслу такой enum эквивалентен набору макросов
 #define TAG1 VALUE1
#define TAG2    (TAG1 + 1)
#define TAG3    (TAG2 + 1)

поэтому вполне ожидаемо и аналогичное правило записи имен.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По смыслу - enum это набор неизменяемых именованных значений, по умолчанию int, но можно и другого.

А вель можно еще её сделать типом и использовать в параметрах, тогда людям понятнее что передается и что возращается.

int Foo(..);

или

ERROR_STATUS Foo(...)

 

А разве это не написано в книжках ?

 

#define можно переопределить, а enum не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Список ошибок часто определяю так:

enum {ERR_1 = 1, ERR_2, ERR_3, ERR_n}; //ну или от 0

А уж возврат ошибочного значения из функции тогда или:

return ERR_...;

или:

return -ERR_...;

А если нужно возвращать из функции или данный код ошибки или корректное состояние, заданное тоже enum-ом, то делаю иногда так:

enum {OK_0, OK_1, OK_2, OK_n};

return (int)OK_1; //корректное завершение с кодом OK_1

return (int)OK_n + (int)ERR_1 - 1; //завершение с ошибкой ERR_1

Т.е. - возвращаются всегда положительные значения. Для Thumb2 такой способ оптимальнее. B) Кто знает асм - поймёт.

 

Оставшиеся 12 разрядов можно использовать для любой полезной инф - битовые флаги, поля итд. Фактически - структура.

Если нужно вернуть 2 параметра, то лучше и возвращать их как 2, а не лепить из них одно в точке return, и не распаковывать потом в точке вызова.

Если мне нужно например на 32-битной архитектуре вернуть 2 значения из функции, я делаю так:

u64 FuncA() {

u64 q = (u32)val1 | (u64)(u32)val2 << 32;

return q;

}

Если пытаться всё лепить в одно 32-битное значение, то будет куча лишних команд при упаковке и потом - при распаковке. А в вышеприведённом случае - минимум команд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну по смыслу такой enum эквивалентен набору макросов
 #define TAG1 VALUE1
#define TAG2    (TAG1 + 1)
#define TAG3    (TAG2 + 1)

поэтому вполне ожидаемо и аналогичное правило записи имен.

По результату - да. По обработке и возможным "засадом" отличается.

enum просчитываются компилятором "за раз", а макросы - это головная боль препроцессора.

Так на какомнибуть TAG756 (сделанный копипастом) :) на вход компилятора попадет:

+ (TAG1)  
+ (TAG1+1) // TAG2
+ ((TAG1 + 1) + 1)  // TAG3
+ (((TAG1 + 1) + 1) + 1 ) // . . . .

... на шаге N у препроцессора (или у компилятора) срабатывает ограничение на длину строки (или списка).

(Это факт, по крайней мере для IAR/MSP430 5.40)

Причем никаких намеков ни Err, ни даже Warn компилятор не выдал.

 

 

 

. . . .

А разве это не написано в книжках ?

Да у меня вопрос собст-но про отрицательные enum. В литературе как-то не натыкался на это.

А проводить гугл-сеанс нет времени. Тем более можно спросить у "первоисточников" на этом форуме :)

 

 

Список ошибок часто определяю так:

. . . .

Ok - спасибо за инф. Надо осмыслить.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно какие преимущества дает использование enum как типа возвращаемого значения функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...