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 범위
- 이 부속서는 프로그램의 보안 취약성 완화에 유용할 수 있는 일련의 옵션 확장을 지정하며, 기존 표준 헤더에 선언되거나 정의된 새로운 기능, 매크로 및 유형으로 구성됩니다.
...
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
'programing' 카테고리의 다른 글
| 부동 소수점 값을 자르는 방법은? (0) | 2023.09.24 |
|---|---|
| 오라클 날짜 범위 (0) | 2023.09.24 |
| Android에서 TextView 범위 색상 설정 (0) | 2023.09.24 |
| Linux에서 파일을 복사하는 가장 효율적인 방법 (0) | 2023.09.24 |
| jQuery를 사용하여 요소의 CSS 속성을 해제하려면 어떻게 해야 합니까? (0) | 2023.09.24 |