programing

strdup 또는 _strdup?

bestcode 2022. 8. 13. 12:14
반응형

strdup 또는 _strdup?

사용할 때strdupMicrosoft Visual C++ 에서는, 다음의 경고가 표시됩니다.

경고 C4996: 'strdup':이 항목의 POSIX 이름은 더 이상 사용되지 않습니다.대신 ISO C++ 준거명 _strdup을 사용합니다.자세한 내용은 온라인 도움말을 참조하십시오.

그런 것 같다_strdup정답입니다.

하지만 사용할 때는_strdupGCC(Fedora Linux OS)에서 컴파일러에 다음 오류가 표시됩니다.

오류: '_strdup'이 이 범위에서 선언되지 않았습니다.

GCC 및 Linux에서는 컴파일러에 다음 오류가 표시되지 않습니다.strdup.

어느 쪽이 맞습니까?strdup또는_strdup?

주의: 다음을 포함합니다.<string.h>내 코드로.

어떤 것이 올바른가요?

strdup는 완전히 올바른 POSIX 함수입니다.그럼에도 불구하고, 이것은 표준에 속하지 않으며, ANSI C 표준은 이후 사용을 위해 일부(광범위한) 클래스의 함수 이름을 예약합니다.이 중에서

  • str로 시작하는 함수 이름 및 소문자

그 때문에 MS의 직원들은 그 자리를 대체하기로 결정했다.strdup와 함께_strdup.

그냥 계속 쓰고 싶다strdupC 위원회에서 정의하지 않을 것 같습니다.strdupPOSIX가 아닌 다른 곳으로.어느 하나#define strdup _strdup경고음을 잠재울 수 있습니다.

그나저나 나는 이것이 다음과 같은 이름을 가진 당신의 기능에 적용되는 것을 보길 바란다.string_list기타도 마찬가지입니다.

#define _CRT_NONSTDC_NO_DEPRECATE를 정의하여 이 경고를 디세블로 할 수 있습니다.

strdup는 표준 C++ 함수가 아닙니다.Posix 함수인 것 같고, 어쨌든 K&R C부터 있었던 잘 알려진 함수이기 때문에 꼭 사용해야 한다면 이름 충돌에 대해 걱정하지 말고 그냥 쓰세요.strdup최대 휴대성을 실현합니다.

경고 메시지를 피하고 싶은 경우:

프로젝트 -> 속성 -> C/C++ -> 프리프로세서 -> 프리프로세서 정의

이것을 편집하여 추가하다

_CRT_NONSTDC_NO_DECRECATE

strdup은 POSIX:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html

_strdup은 Windows 고유:

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

UNIX 에서는 strdup 을 사용합니다.Windows 에서는 _strdup 을 사용합니다.그렇게 간단하다.Unix 와 Windows 사이에 휴대용 코드를 쓸 필요가 있는 경우:

  • 시스템 의존 매크로(예를 들어 _WIN32 vs. _POSIX_VERSION)를 사용하여 적절한 기능을 선택합니다(단, 매크로가 기존의 특정 포함 파일에 의존할 수 있습니다).

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html

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

  • strdup을 다시 구현하려면 strlen, malloc 및 memmove의 표준 함수를 사용합니다.

  • glib와 같은 크로스 플랫폼 유틸리티 라이브러리를 사용합니다.

http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html#g-strdup

Visual C++ 메시지는 _strdup이 C++ 표준에 속하지만 C++ 표준에서 확인할 수 있으므로 이는 거짓임을 나타냅니다.함수의 「네임스페이스」로서 밑줄 프리픽스를 사용할 뿐입니다.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf

이는 경고가 아니라 vs.의 상위 버전에서 보고된 오류입니다.

를 사용#ifdef WIN32

C++는 몰라요.

C 표준에서는 다음과 같은 기능을 설명하지 않습니다.strdup).name(이름은 예약되어 있습니다)., C, C, C로 대체하는 것이 .malloc,strcpy , , , , 입니다.free.

언급URL : https://stackoverflow.com/questions/7582394/strdup-or-strdup

반응형