programing

strdup 또는 _strdup?

minecode 2021. 1. 14. 08:09
반응형

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표준 C ++ 함수가 아닙니다. 그러나 그것은 분명히 Posix 함수이고, 어쨌든 K & R C 이후 거기에 있었던 잘 알려진 함수 입니다. 그래서 꼭 사용해야한다면 이름 충돌 가능성에 대해 걱정하지 말고 strdup최대한의 이식성을 위해 작성하십시오 .


어느 것이 맞습니까?

strdup완벽하게 정확한 POSIX 함수입니다. 그럼에도 불구하고 표준에 속하지 않으며 ANSI C 표준은 추가 사용을 위해 일부 (광범위한) 함수 이름 클래스를 예약합니다. 이 중

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

따라서 MS의 사람은 교체하기로 결정 strdup으로 _strdup.

계속 사용하겠습니다 strdup. C위원회가 strdupPOSIX 이외의 것을 정의 가능성은 거의 없습니다 . 하나 #define strdup _strdup또는 경고를 침묵.

BTW 나는 이것이 같은 이름을 가진 함수에도 적용된다는 것을 알기를 바랍니다 string_list.


_CRT_NONSTDC_NO_DEPRECATE#define 하여이 경고를 비활성화 할 수 있습니다 .


경고 메시지를 피하려면 :

프로젝트-> 속성-> C / C ++-> 전 처리기-> 전 처리기 정의

이것을 편집하고 추가하십시오

_CRT_NONSTDC_NO_DEPRECATE


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 대 _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 ++ 표준에서 확인할 수 있으므로 false 입니다. 함수의 "네임 스페이스"로 밑줄 접두사를 사용합니다.

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


C ++에 대해 모릅니다.

C 표준 어떤 기능 설명이없는 strdup(이름이 예약되어 있지만) 이름. 이식하기 위해서는 C malloc에서 strcpy,, 및으로 바꾸는 것이 좋습니다 free.


경고는 아니지만 상위 버전에서보고 된 오류입니다.

매크로 #ifdef WIN32사용 하여 전환

참조 URL : https://stackoverflow.com/questions/7582394/strdup-or-strdup

반응형