Если ошибка, то переключайтесь против переключателя в «хорошем» случае - PullRequest
0 голосов
/ 03 октября 2010

Я не очень знаком с машинным кодом, но я думаю, что это довольно простой вопрос.
Если я хочу выполнять обработку ошибок через целое число, возвращаемое функцией (в отличие от функции, которая выдает исключение)Это лучше практиковать - с точки зрения машинного кода - до:

  1. Проверьте целое число в условном выражении на наличие «плохого» значения, а затем используйте оператор switch для обработки «плохого» значения(s) или
  2. Переключите целое число и укажите регистр для "хорошего" значения (й), а также для "плохого" значения (й)

Например,, в C ++:

enum error_code {E_GOOD, E_BAD, E_UGLY};
error_code func_b();

Вариант 1

void func_a()
{
    error_code err_catch = func_b();

    if (err_catch)
    {
        switch (err_catch)
        {
        case E_BAD:
            /* Handle bad case */
            break;
        case E_UGLY:
            /* Handle ugly case */
            break;
        }
    }
}

Вариант 2

void func_a()
{
    error_code err_catch = func_b();

    switch (err_catch)
    {
    case E_GOOD:
        break;
    case E_BAD:
        /* Handle bad case */
        break;
    case E_UGLY:
        /* Handle ugly case */
        break;
    }
}

Спасибо заваша помощь.

Ответы [ 2 ]

1 голос
/ 03 октября 2010

Для типов enum я бы напрямую использовал оператор switch, чтобы компилятор мог убедиться, что оператор switch действительно обрабатывает все возможные значения.

1 голос
/ 03 октября 2010

Первый тест, вероятно, должен быть:

if (err_catch != E_GOOD)

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

 typedef enum error_code error_code;

Там будет очень мало различий между ними с точки зрения генерируемого кода.

Я бы, вероятно, просто использовал Вариант 1 (запись if)чтобы было ясно, что коммутатор имеет дело только со случаями ошибок (потому что он имеет дело только со случаями ошибок), но я бы не стал возражать против этого, если бы он был представлен мне для проверки кода.

...