2010-02-16 13 views
2
오류시 외부 .EXE 및 오류 검사 코드 실행 system()를 호출

:errorno 및 _get_errno는 어떻게 사용합니까?

#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

고맙습니다. 궁금 해서요, 왜 Windows 기능을 사용하는 컴파일이 작동하지 않았는지 알 수 있습니까? –

+0

나는 100 % 확신 할 수는 없지만 Windows 및 .NET 버전 때문에 가장 좋은 추측입니다. btw는 함수 이름이 밑줄로 시작하기 때문에 외부에서 사용하지 않아야합니다 (타사 개발). 여기에 함수의 정보를보십시오 : http://msdn.microsoft.com/en-us/library/wwfcfxas%28VS.80%29.aspx 거기에 표시된 예제에서 밑줄는 잘못된 것도 있습니다. – shinkou

2

선언없이 'errno'를 사용하십시오. 이것은 int 값으로 확장되는 매크로입니다. here에서 가져

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

:

+0

awesome, thanks –

2

표준 C의 세계에서 'errno_t'유형은 TR24731-1 (자세한 내용은 Do you use the TR 24731 'safe' functions? 참조)에 의해 정의되며 '__STDC_WANT_LIB_EXT1__'을 정의하여 '활성화'해야합니다.

그러나 Windows에서 작동하는 것처럼 보입니다 ('tail.exe'및 비표준 '_get_errno()'으로 판단). 규칙은 사용중인 C 컴파일러에 따라 다를 수 있습니다. 'Security Enhancements in the CRT '에있는이 MSDN 기사의 정보를 추적 할 수 있어야합니다. 내 인상은 당신이 능동적으로 기능을 억제하지 않으면 그것이 정의되어야한다는 것이었고, 그래서 당신이 당신의 컴파일에서 그것을 적극적으로 억제하고 있는지 확인하십시오.

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 
); 

같은 vsnprintf_s() 같은 기능의 MSVC 정의가 TR24731-1 정의를 일치하지 않음을 유의 차이는 형식 별칭이나 한정자 (rsize_t, restrict)의 질문이 아닙니다. MS 버전에는 두 가지 크기가 있으며 표준 버전. 표준화를위한 많은 노력!

+0

멋진 정보, 감사합니다. –

관련 문제