64

当我strdup在 Microsoft Visual C++ 中使用时,它会警告我:

警告 C4996:“strdup”:不推荐使用此项目的 POSIX 名称。而是使用符合 ISO C++ 的名称:_strdup。详细信息请参见在线帮助。

因此,它似乎_strdup是正确的。

但是当我_strdup在 GCC (Fedora Linux OS) 中使用时,编译器显示错误:

错误:未在此范围内声明“_strdup”

使用 GCC 和 Linux,编译器不会为strdup.

哪个是正确的 -strdup_strdup

注意:我包含<string.h>在我的代码中。

4

7 回答 7

42

哪个是对的?

strdup是一个完全正确的 POSIX 函数。然而,它不属于该标准,并且 ANSI C 标准保留了一些(广泛的)函数名称类以供进一步使用。其中,有

  • 以str和小写字母开头的函数名

因此,MS 家伙决定strdup_strdup.

我只是继续使用strdup. C 委员会不太可能定义strdupPOSIX 以外的其他内容。或者#define strdup _strdup使警告静音。

顺便说一句,我希望你看到这也适用于你的函数,比如string_list等。

于 2011-09-28T11:46:23.160 回答
34

strdup不是标准的 C++ 函数。但它显然是一个 Posix 函数,无论如何它是一个众所周知的函数,自 K&R C 以来就一直存在。所以如果你绝对必须使用它,不要担心任何可能的名称冲突,而只是strdup为了最大的可移植性而编写。

于 2011-09-28T11:28:49.220 回答
26

您可以#define _CRT_NONSTDC_NO_DEPRECATE禁用此警告。

于 2014-06-25T23:34:12.797 回答
12

如果您只想避免警告消息:

项目-> 属性-> C/C++ -> 预处理器-> 预处理器定义

编辑这个,并添加

_CRT_NONSTDC_NO_DEPRECATE

于 2015-03-26T14:21:56.260 回答
8

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++ 标准上进行验证。它仅使用下划线前缀作为函数的“命名空间”。

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

于 2012-11-27T01:16:53.713 回答
5

不知道C++。

C 标准没有使用名称描述任何函数(strdup尽管名称是保留的)。为了便于移植,在 C 中,您最好将其替换为malloc,strcpyfree.

于 2011-09-28T11:21:40.177 回答
0

这不是警告,而是在更高版本的 vs 中报告的错误。

使用宏#ifdef WIN32切换

于 2017-04-27T08:14:19.823 回答