开发者

strdup or _strdup?

开发者 https://www.devze.com 2023-04-08 01:12 出处:网络
When I use strdup in Microsoft Visual C++, it warns me: warning C4996: \'strdup\': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for

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

warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for details.

Thus it seems _strdup is correct.

But when I use _strdup in GCC (Fedora Linux OS), the compiler shows an error:

error: ‘_strdup’ was not declared in this scope

With GCC and Linux, compiler does not show any error for strdup开发者_开发知识库.

Which is correct - strdup or _strdup?

Note: I include <string.h> in my code.


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.


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.


You can #define _CRT_NONSTDC_NO_DEPRECATE to disable this warning.


If you just want to avoid the Warning message:

Project-> property -> C/C++ -> Preprocessor -> Preprocessor Definitions

Edit this, and add

_CRT_NONSTDC_NO_DEPRECATE


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


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.


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

use macro #ifdef WIN32 to switch

0

精彩评论

暂无评论...
验证码 换一张
取 消