strdup 还是 _strdup?
当我在 Microsoft Visual C++ 中使用 strdup
时,它会警告我:
警告 C4996:“strdup”:此项目的 POSIX 名称已弃用。相反,请使用 ISO C++ 一致名称:_strdup。有关详细信息,请参阅联机帮助。
因此,_strdup
似乎是正确的。
但是当我在 GCC(Fedora Linux 操作系统)中使用 _strdup
时,编译器显示错误:
错误:“_strdup”未在此范围内声明
对于 GCC 和 Linux,编译器不会显示 strdup
的任何错误。
strdup
或 _strdup
哪个是正确的?
注意:我在代码中包含
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
strdup
是一个完全正确的 POSIX 函数。然而,它不属于该标准,并且 ANSI C 标准保留了一些(广泛的)函数名称类别以供进一步使用。其中,有些,因此 MS 人员决定将
strdup
替换为_strdup
。我只是继续使用
strdup
。 C 委员会不太可能将strdup
定义为 POSIX 之外的其他内容。#define strdup _strdup
或消除警告。顺便说一句,我希望您看到这也适用于具有
string_list
等名称的函数。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 aretherefore, the MS guys decided to replace
strdup
with_strdup
.I'd just continue using
strdup
. It's unlikely the C committee will definestrdup
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
不是标准 C++ 函数。但它显然是一个 POSIX 函数,而且无论如何,它是一个众所周知的函数,自 K&R C 以来就一直存在。因此,如果您绝对必须使用它,请不要担心任何可能的名称冲突,并且只需编写strdup
即可获得最大的可移植性。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 writestrdup
for maximum portability.您可以#define _CRT_NONSTDC_NO_DEPRECATE 禁用此警告。
You can #define _CRT_NONSTDC_NO_DEPRECATE to disable this warning.
如果您只是想避免出现警告消息:
编辑此内容,然后添加
If you just want to avoid the Warning message:
Edit this, and add
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 之间编写可移植代码:
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
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:
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
不知道C++。
C 标准没有描述任何带有
strdup
名称(尽管该名称是保留的)。为了便于移植,在 C 语言中,最好将其替换为
malloc
、strcpy
和free
。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
, andfree
.这不是警告,而是在高版本的 vs 中报告错误。
使用宏
#ifdef WIN32
进行切换it's not a warning but an error reported in higher version of vs.
use macro
#ifdef WIN32
to switch