strdup还是_strdup?

时间:2011-09-28 11:17:57

标签: c++ c visual-studio 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>

7 个答案:

答案 0 :(得分:34)

  

哪个是对的?

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

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

因此,MS人员决定用strdup替换_strdup

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

顺便说一下,我希望您也看到这适用于您的string_list等名称的功能。

答案 1 :(得分:28)

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

答案 2 :(得分:19)

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

答案 3 :(得分:9)

如果您只是想避开警告信息:

  

项目 - &GT; property - &gt; C / C ++ - &gt;预处理器 - &gt;预处理器定义

编辑此内容,然后添加

  

_CRT_NONSTDC_NO_DEPRECATE

答案 4 :(得分:7)

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 ++标准,但这是 false ,因为它可以在C ++标准上进行验证。它只使用下划线前缀作为函数的“命名空间”。

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

答案 5 :(得分:5)

不了解C ++。

C Standard没有描述strdup名称的任何函数(尽管名称是保留的)。 为了便携,在C中,您最好使用mallocstrcpyfree替换它。

答案 6 :(得分:-1)

它不是警告,但在更高版本的vs。

中报告了错误

使用宏#ifdef WIN32切换