strdup或_strdup?

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

警告C4996:'strdup':此项目的POSIX名称已弃用。 而是使用ISO C ++一致性名称:_strdup。 详细信息请参见在线帮助。

因此,似乎_strdup是正确的。

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

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

使用GCC和Linux,编译器不会显示任何strdup错误。

这是正确的 – strdup_strdup

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

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

哪个是对的?

strdup是一个完全正确的POSIX函数。 尽pipe如此,它不属于标准,而ANSI C标准保留了一些(广泛的)function名称类别供进一步使用。 其中,有

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

因此,MS们决定用_strdupreplacestrdup

我只是继续使用strdup 。 C委员会不太可能将strdup定义为POSIX以外的东西。 要么#define strdup _strdup要么静默警告。

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

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

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

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

编辑这个,然后添加

_CRT_NONSTDC_NO_DEPRECATE

不知道C ++。

C标准没有描述带有strdup名称的任何函数(尽pipe名称是保留的)。 为了便于携带,在C中,最好用mallocstrcpyfree来代替它。

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之间编写可移植的代码:

  • 使用系统相关的macros(例如_WIN32与_POSIX_VERSION)来select适当的函数(但注意macros可能取决于特定的现有包含文件):

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

jtc1/sc22/wg21/docs/papers/2012/n3376.pdf

这不是一个警告,但在更高版本vs.

使用macros#ifdef WIN32进行切换