我如何使用errorno和_get_errno?

时间:2010-02-16 01:14:44

标签: c++ c windows winapi

调用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

我不知道为什么要包括required and optional header files? 任何帮助表示赞赏。谢谢。

3 个答案:

答案 0 :(得分:3)

典型用法如下:

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

取自here

答案 1 :(得分:2)

在没有任何声明的情况下使用'errno'。它是一个扩展为int值的宏。

答案 2 :(得分:2)

在标准C的世界中,类型“errno_t”由TR24731-1定义(有关详细信息,请参阅Do you use the TR 24731 'safe' functions?),您必须通过定义'{{1来'激活它' }}”。

但是,您似乎正在使用Windows(从'tail.exe'和非标准'__STDC_WANT_LIB_EXT1__'判断)。那里的规则可能取决于您使用的C编译器。 您应该可以在'Security Enhancements in the CRT'上查看此MSDN文章中的信息。我的印象是它应该被定义,除非你主动压制该功能,所以检查你是否在你的编辑中主动压制它。

请注意,_get_errno()等函数的MSVC定义与TR24731-1定义不匹配:

MSDN:

vsnprintf_s()

TR 24731-1:

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

区别不仅仅是类型别名或限定符(int vsnprintf_s( char * restrict s, rsize_t n, const char * restrict format, va_list arg ); rsize_t)的问题 - MS版本有两种尺寸,标准版本有一种尺寸。非常标准化!