programing

sprintf_s가 이 범위에서 선언되지 않았습니다.

itmemos 2023. 9. 24. 12:23
반응형

sprintf_s가 이 범위에서 선언되지 않았습니다.

사용하는 C 프로그램이 있습니다.sprintf_s. 윈도우에서는 잘 작동하지만 리눅스에서 코드를 컴파일하면 다음과 같은 오류가 발생합니다.

sprintf_s was not declared in this scope.

왜 이런 일이 일어나고 어떻게 고칠 수 있을까요?

그것은 표준이 아닙니다. 리눅스에서는 그런 기능을 찾을 수 없을 것입니다.

표준함수snprintf유사한 의미론을 가져야 합니다.

sprintf_s는 표준 C 라이브러리의 일부가 아니므로 휴대용이 아니므로 Linux에서 사용할 수 없습니다. 하지만 snprintf가 매우 유사하므로 원하는 작업을 수행하는 데 도움이 될 것입니다.

sprintf_s는 C11 표준의 선택적 부속서인 부속서 K의 일부일 뿐입니다.

별첨K

...

K.2 범위

  1. 이 부속서는 프로그램의 보안 취약성 완화에 유용할 수 있는 일련의 옵션 확장을 지정하며, 기존 표준 헤더에 선언되거나 정의된 새로운 기능, 매크로 및 유형으로 구성됩니다.

...

K.3.5.3.6 스프린트 f_s 기능

시놉시스

#define __STDC_WANT_LIB_EXT1__1
#include <stdio.h>
int sprintf_s(char * restrict s, rsize_t n,
const char * restrict format, ...);

(emphasis 추가)

POSIX(또는 Linux)에 한 번도 진입하지 못했습니다. (위원회에서 이 기능의 유용성에 대한 논쟁이 있을 정도입니다.

휴대성을 향상시키려면 핵심 표준의 일부이며 필요한 모든 기능을 제공하는 를 사용합니다.

sprintf_s는 표준 C 라이브러리의 일부가 아니므로 리눅스에서는 사용할 수 없습니다.

하지만,snprintf는 표준이며 동일한 작업을 수행해야 합니다.

윈도우에서 리눅스로 프로그램을 포팅하는 동안 나는 내 윈도우에 다음과 같은 구현을 적었습니다.h:

inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);
    return result;
}

template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);
    return result;
}

snprintf는 안전하지 않고 sprintf_s만 안전합니다. snprintf는 최종 \0을 추가하는 것을 보장하지 않으므로 이후 오버플로가 발생할 수 있습니다.https://github.com/rurban/safeclib 에서 적절한 구현을 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4828228/sprintf-s-was-not-declared-in-this-scope

반응형