strdup or _strdup?

后端 未结 7 2093
我寻月下人不归
我寻月下人不归 2020-12-01 04:05

When I use strdup in Microsoft Visual C++, it warns me:

warning C4996: \'strdup\': The POSIX name for this item is deprecated. Instead, u

相关标签:
7条回答
  • 2020-12-01 04:34

    strdup is POSIX:

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

    _strdup is Windows specific:

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

    On Unix, use strdup. On Windows, use _strdup. It's that simple. If you need to write portable code between Unix and Windows:

    • use system dependent macros (for example _WIN32 vs. _POSIX_VERSION) to select the proper function (but notice that the macros may depend on specific pre existing include files):

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

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

    • use standard functions to reimplement strdup: strlen, malloc and memmove.

    • use a cross platform utility library, like glib:

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

    Note that Visual C++ message suggests that _strdup belongs to the C++ standard, but this is false, as it can be verified on the C++ standard. It merely uses the underscore prefix as a "namespace" for the function.

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

    0 讨论(0)
  • 2020-12-01 04:38

    Don't know about C++.

    The C Standard does not describe any function with the strdup name (though the name is reserved). To be portable, in C, you're better off replacing that with malloc, strcpy, and free.

    0 讨论(0)
  • 2020-12-01 04:43

    You can #define _CRT_NONSTDC_NO_DEPRECATE to disable this warning.

    0 讨论(0)
  • 2020-12-01 04:46

    strdup is not a standard C++ function. but it is apparently a Posix function, and anyway it's a well known function which has been there since K&R C. so if you absolutely must use it, do not fret about any possible name collision, and just write strdup for maximum portability.

    0 讨论(0)
  • 2020-12-01 04:47

    Which is correct?

    strdup is a perfectly correct POSIX function. Nevertheless, it doesn't belong to the standard, and the ANSI C standard reserves some (broad) classes of function names for further use. Among these, there are

    • Function names that begin with str and a lowercase letter

    therefore, the MS guys decided to replace strdup with _strdup.

    I'd just continue using strdup. It's unlikely the C committee will define strdup to something else than POSIX. Either #define strdup _strdup or silence the warning.

    BTW I hope you see this applies to your functions with names like string_list etc., too.

    0 讨论(0)
  • 2020-12-01 04:54

    it's not a warning but an error reported in higher version of vs.

    use macro #ifdef WIN32 to switch

    0 讨论(0)
提交回复
热议问题