Как мне использовать errorno и _get_errno? - PullRequest
2 голосов
/ 16 февраля 2010

Вызов system () для запуска внешнего .exe и проверки кода ошибки при ошибках:

#include <errno.h>       
#include <stdlib.h>

function()
{
    errno_t err;


      if( system(tailCmd) == -1) //if there is an error get errno
      {
          //Error calling tail.exe 
          _get_errno( &err );  

      }
}

Первые две ошибки компиляции:

error C2065: 'err' : undeclared identifier
error C2065: 'errno_t' : undeclared identifier

Не уверен, почему, поскольку я включаю обязательные и дополнительные заголовочные файлы ?
Любая помощь приветствуется. Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2010

Типичное использование:

if (somecall() == -1) {
    int errsv = errno;
    printf("somecall() failed\n");
    if (errsv == ...) { ... }
}

который взят из здесь .

2 голосов
/ 16 февраля 2010

В мире Standard C тип 'errno_t' определяется TR24731-1 (см. Используете ли вы функции TR 24731 «safe»? для получения дополнительной информации), и вам необходимо «активировать его», определив «__STDC_WANT_LIB_EXT1__».

Однако вы, похоже, работаете в Windows (судя по «tail.exe», а также нестандартному «_get_errno()»). Правила могут зависеть от того, какой компилятор C вы используете. Вы сможете найти информацию из этой статьи MSDN о «Улучшения безопасности в CRT ». У меня сложилось впечатление, что оно должно быть определено, если вы активно не подавляете эту функцию, поэтому проверьте, активно ли вы ее подавляете в своих сборниках.

Имейте в виду, что определения функций MSVC, такие как vsnprintf_s(), не соответствуют определениям TR24731-1:

MSDN:

int vsnprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   va_list argptr 
);

TR 24731-1:

int vsnprintf_s(
    char * restrict s,
    rsize_t n,
    const char * restrict format,
    va_list arg
);

Разница не только в псевдонимах или квалификаторах типов (rsize_t, restrict) - в версии MS есть два размера, а в стандартной версии - один. Так много для стандартизации!

2 голосов
/ 16 февраля 2010

Просто используйте 'errno' без какого-либо объявления. Это макрос, который расширяется до значения int.

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