当我在Microsoft Visual C ++中使用strdup
时,它会警告我:
警告C4996:'strdup':不推荐使用此项目的POSIX名称。而是使用符合ISO C ++的名称:_strdup。有关详细信息,请参阅在线帮助。
因此似乎_strdup
是正确的。
但是当我在GCC(Fedora Linux OS)中使用_strdup
时,编译器显示错误:
错误:'_strdup'未在此范围内声明
使用GCC和Linux,编译器不会显示strdup
的任何错误。
哪个是正确的 - strdup
或_strdup
?
注意:我在代码中添加了<string.h>
。
答案 0 :(得分:34)
哪个是对的?
strdup
是一个完全正确的POSIX函数。然而,它不属于标准,ANSI C标准保留了一些(广泛)类别的函数名称以供进一步使用。其中,有
因此,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之间编写可移植代码:
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中,您最好使用malloc
,strcpy
和free
替换它。
答案 6 :(得分:-1)
它不是警告,但在更高版本的vs。
中报告了错误使用宏#ifdef WIN32
切换