реклама на сайте
подробности

 
 
> CPP enum с минусовыми значениями, насколько это правильно
k155la3
сообщение May 25 2017, 06:25
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



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

(?) Насколько такой подход (с отрицательным 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 - May 25 2017, 07:20
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение May 26 2017, 10:10
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



По-моему идеально использовать enum по возможности так, чтобы было вообще всё равно какое там у него значение.
Оно так автоматически и получается, если везде работать с enum как с типом, а не пользоваться тем, что он может быть неявно преобразован в int.

Если все ошибки в вашей системе перечислены в enum и вам не нужно обеспечивать совместимость со сторонним кодом, где у ошибок есть конкретные int значения, то определите для ошибок тип
Цитата
typedef enum{
ERR_OK,
ERR_SOMETHING,
ERR_SOMETHING2
} Error_t;


Пусть все функции будут возвращать Error_t, а обработчики ошибок везде будут реагировать на ошибки путем обращения к ним по именам ERR_OK, ERR_SOMETHING, ERR_SOMETHING2 то всё будет отлично.
Код
switch( error)
{
case ERR_OK: делаем что-то
break;
case ERR_SOMETHING:
break;
case ERR_SOMETHING2:
break;
}

Это будет работать вне зависимости от значений энумов.

Eсли функция возвращает int а мы делаем return ERR_SOMETHING; который вообще-то Error_t - это дурной тон.
Потом чтобы обработать эту ошибку нам надо этот инт опять кастить в enum и начинается каша. Потом кто-то подставит вместо ERR_SOMETHING магическое число какое-нибудь и оно работает. Через год в энум Error_t доавбяют сверху пару новых кодов ошибок, значения все съезжают и то самое магическое число начинает указывать на другую ошибку. Начинается очень большое веселье.

Систему типов компилятора надо использовать, а не бороться с ней!


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AlexRayne
сообщение May 26 2017, 13:33
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(sigmaN @ May 26 2017, 13:10) *
Код
typedef enum{
ERR_OK,
ERR_SOMETHING,
ERR_SOMETHING2
} Error_t;

sigmaN: а почему Вы большими буквами значения енума определяете?

Сообщение отредактировал AlexRayne - May 26 2017, 13:33
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- k155la3   CPP enum с минусовыми значениями   May 25 2017, 06:25
- - novikovfb   Почему бы и нет. Одно не понятно: чем запись minu...   May 25 2017, 06:32
|- - k155la3   Цитата(novikovfb @ May 25 2017, 09:32) По...   May 25 2017, 06:35
- - _pv   Цитатаinteger constant expression whose value is r...   May 25 2017, 07:22
|- - k155la3   "integer constant expression whose value is r...   May 25 2017, 07:32
|- - AlexRayne   Цитата(k155la3 @ May 25 2017, 11:32) Инте...   May 25 2017, 09:46
|- - k155la3   Цитата(AlexRayne @ May 25 2017, 12:46) . ...   May 25 2017, 10:35
||- - AlexRayne   Цитата(k155la3 @ May 25 2017, 14:35) (1) ...   May 25 2017, 12:27
|- - Сергей Борщ   QUOTE (AlexRayne @ May 25 2017, 12:46) Ме...   May 25 2017, 12:47
|- - k155la3   Цитата(Сергей Борщ @ May 25 2017, 15:47) ...   May 26 2017, 07:25
- - AnatolyT   Постоянно применяю, только не enum, а int. Обычная...   May 25 2017, 08:00
|- - k155la3   Цитата(AnatolyT @ May 25 2017, 11:00) . ....   May 25 2017, 08:47
- - x893   По смыслу - enum это набор неизменяемых именованны...   May 25 2017, 16:36
|- - jcxz   Список ошибок часто определяю так: enum {ERR_1 = 1...   May 25 2017, 20:47
- - AnatolyT   Непонятно какие преимущества дает использование en...   May 26 2017, 09:11
|- - novikovfb   Цитата(AnatolyT @ May 26 2017, 13:11) Неп...   May 26 2017, 09:46
||- - Сергей Борщ   QUOTE (novikovfb @ May 26 2017, 12:46) пр...   May 26 2017, 09:54
|- - k155la3   Цитата(AnatolyT @ May 26 2017, 12:11) Неп...   May 26 2017, 10:01
|- - jcxz   Цитата(k155la3 @ May 26 2017, 12:01) Кром...   May 28 2017, 10:26
|- - k155la3   Цитата(AlexRayne @ May 26 2017, 16:33) si...   May 26 2017, 14:38
- - AnatolyT   Может быть чтобы не было соблазна добавить в начал...   May 26 2017, 10:25
- - sigmaN   ЦитатаМожет быть чтобы не было соблазна добавить в...   May 26 2017, 10:58
- - sigmaN   Цитатаа почему Вы большими буквами значения енума ...   May 26 2017, 15:45
|- - dxp   QUOTE (sigmaN @ May 26 2017, 22:45) да эт...   May 27 2017, 05:21
|- - AlexRayne   Цитата(dxp @ May 27 2017, 09:21) Скорее н...   May 29 2017, 07:42
- - sigmaN   Кстати вы заметили, как в С++11 поправили enum? Я ...   May 28 2017, 09:13
|- - dxp   QUOTE (sigmaN @ May 28 2017, 16:13) Кстат...   May 28 2017, 13:02
- - sigmaN   ЦитатаThe enum type The compiler will use the smal...   May 28 2017, 11:17
|- - jcxz   Цитата(sigmaN @ May 28 2017, 13:17) The c...   May 29 2017, 08:35
- - sigmaN   ЦитатаТолько enum class - это, я понял, как раз со...   May 28 2017, 13:50
- - sigmaN   Ну тогда надо конкретизировать на примерах. Я так...   May 29 2017, 08:55
|- - jcxz   Цитата(sigmaN @ May 29 2017, 10:55) Я так...   May 29 2017, 09:34
- - sigmaN   Вот и я гворю: уточнять надо. Кто куда и кого расш...   May 29 2017, 10:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 17:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016