비주얼씨뿔뿔과 지씨씨에서 sprintf를 사용할 때의 차이

dltkddyd의 이미지

Visual C++에서 sprintf를 썼는데, 경우에 따라서는 sprintf_s를 사용하라며 오류 메시지를 출력합니다. C++ 표준에서는 sprintf_s를 지원하지 않더군요. 마이크로소프트 전용이라서 다른 플랫폼, 예컨대 GCC에서는 sprintf_s를 사용하는 코드는 컴파일 되지 않을 겁니다. GCC에서는 sprintf만 지원하죠.
제가 라이브러리로 포함할 코드 몇 가지를 만들던 중 sprintf_s나 sprintf 함수를 선택적으로 사용할 수 있는 방법으로 전처리기를 사용하면 좋을 것 같다고 생각했습니다. 예컨대 비주얼을 나타내는 상수가 A라 하고, GCC 컴파일러를 나타내는 상수를 B라고 약속하면 다음과 같이 사용할 수 있겠죠.

#ifdef A
sprintf_s(...);
#endif
#ifdef B
sprintf(...);
#endif

그러니까 질문드리려는 것은 각 컴파일러를 구분하는 고유상수가 존재하는가라는 것입니다. 컴파일러를 구분하는 고유상수는 뭔가요?

gilgil의 이미지

__STDC_WANT_SECURE_LIB__ 가 선언이 되어 있으면 VS 컴파일러로 보면 됩니다.
다음과 같이 사용하면 됩니다.

#ifndef __STDC_WANT_SECURE_LIB__
 
#define vsprintf_s(buf, size, fmt, ...)  vsprintf(buf, fmt, ##__VA_ARGS__)
#define strcpy_s(dst, size, src)         strcpy(dst, src)
#define scanf_s(fmt, size, ...)          scanf(fmt, ##__VA_ARGS__)
#define memmove_s(dst, size, src, count) memmove(dst, src, count)
#define gets_s(buf, size)                gets(buf)
 
#endif // __STDC_WANT_SECURE_LIB__
댓글 첨부 파일: 
첨부파일 크기
Package icon vsecurelib.zip1.08 KB
dltkddyd의 이미지

전에도 좋은 답변덕분에 문제 해결에 많은 도움이 됐습니다. 그런데 전처리기에서 사용하신 ##는 뭘 의미하는 건가요?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

ymir의 이미지

## 은 concatenation macro 입니다.

http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

empty2fill의 이미지

컴파일러/아키텍춰/운영체제를 구분하는 상수가 있구요.

원하는시는 것은 컴파일러를 구분하는 상수가 아니라 운영체제를 구분하는 상수 맞지요?

Windows
Type Macro Description
Identification _WIN16 Defined for 16-bit environments 1
Identification _WIN32 Defined for both 32-bit and 64-bit environments 1
Identification _WIN64 Defined for 64-bit environments 1
Identification __WIN32__ Defined by Borland C++
Identification __TOS_WIN__ Defined by xlC
Identification __WINDOWS__ Defined by Watcom C/C++

Linux kernel
Type Macro Description
Identification __linux__ 1
Identification linux Obsolete (not POSIX compliant)
Identification __linux Obsolete (not POSIX compliant)

[참고]
운영체제 구분 : http://sourceforge.net/p/predef/wiki/OperatingSystems
컴파일러 구분 : http://sourceforge.net/p/predef/wiki/Compilers
아키텍춰 구분 : http://sourceforge.net/p/predef/wiki/Architectures

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

dhunter의 이미지

원하시는게 이것 같습니다.

GCC : __GNUC__
http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

MSVC: _MSC_VER
http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx

from bzImage
It's blue paper

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.