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们决定用_strdup
replacestrdup
。
我只是继续使用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中,最好用malloc
, strcpy
和free
来代替它。
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。 它仅使用下划线前缀作为函数的“名称空间”。
这不是一个警告,但在更高版本vs.
使用macros#ifdef WIN32
进行切换