当我在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条答案
按热度按时间xnifntxz1#
哪个是正确的?
strdup
是一个完全正确的POSIX函数。尽管如此,它不属于标准,ANSI C标准保留了一些(广泛的)函数名类以供将来使用。其中,有因此,微软的人决定用
_strdup
替换strdup
。继续使用
strdup
。C委员会不太可能将strdup
定义为POSIX以外的东西。#define strdup _strdup
或使警告静音。顺便说一句,我希望你看到这也适用于你的函数,比如
string_list
等等。doinxwow2#
strdup
不是标准的C++函数。但它显然是一个POSIX函数,而且无论如何,它是一个自K&R C以来就存在的 * 众所周知的函数 *。因此,如果您必须使用它,不要担心任何可能的名称冲突,只需编写strdup
以获得最大的可移植性。iecba09b3#
您可以#define _CRT_NONSTDC_NO_DEPRECATE来禁用此警告。
ukqbszuj4#
如果您只想避免警告消息:
项目->属性-> C/C++ ->预处理器->预处理器定义
编辑此内容,并添加
_CRT_NONSTDC_NO_弃用
xe55xuns5#
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
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
ubbxdtey6#
我不知道C++。
C Standard不描述任何具有
strdup
名称的函数(尽管该名称是保留的)。为了便于移植,在C中,最好用malloc
、strcpy
和free
替换它。vltsax257#
这不是一个警告,而是一个错误报告在更高版本的vs.
使用宏
#ifdef WIN32
切换