C обертка для errno - PullRequest
       14

C обертка для errno

0 голосов
/ 04 декабря 2018

Я написал функцию, чтобы обернуть ошибку, но у меня есть ошибка компиляции: error: 'EACCES', необъявленный (первое использование в этой функции) case EACCES: Что я делаю неправильно?Как я могу обернуть ошибку с выключателем?status_t определен как перечень соответствующих ошибок.

static status_t GetErrorStatus (int errno_value)
    {
        status_t err_status = COMMON_ERROR;

        switch (errno_value) 
        {
            case EACCES: 
                err_status = NO_ACCESS_PERMISSION;
                break;
            case EPERM:
                err_status = NO_ACCESS_PERMISSION;
                break;
            case EIDRM:
                err_status = SEMAPHORE_REMOVED;
                break;
            case ENOENT:
                err_status = FILE_DOESNT_EXIST;
                break;
            case EEXIST:
                err_status = SEMAPHORE_ALREADY_EXISTS;
                break;

            default: err_status = COMMON_ERROR;
        }
        return (err_status);
    }

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Как можно обернуть errno корпусом для выключателя?

Не все платформы поддерживают различные ошибки.C указывает только 3: EDOM EILSEQ ERANGE в <errno.h> и, что важно, они являются макросами .Я ожидаю, что дополнительные ошибки, специфичные для платформы, также будут настолько тестируемыми.

    switch (errno_value) 
    {
        #ifdef EACCES
        case EACCES: 
            err_status = NO_ACCESS_PERMISSION;
            break;
        #endif
        #ifdef EPERM
        case EPERM:
            err_status = NO_ACCESS_PERMISSION;
            break;
        #endif
        ...
0 голосов
/ 04 декабря 2018

Показать полный код.

Я предполагаю, что вы забыли #include <errno.h> или что в вашей конкретной системе EACCESS не определено.

Вкл.Linux, прочитайте errno (3) .EACCESS упоминается как POSIX, поэтому в некоторых системах, отличных от POSIX, он не может быть определен.

Стандарт C11 n1570 упоминает errno в своих §7.5, а EACCESS - этотам нет в спискеЕсли он существует, он должен быть макросом, поэтому вы можете обернуть какую-то подходящую часть кода с помощью #ifdef EACCESS ... #endif

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