C语言 strdup还是_strdup?

xhv8bpkk  于 2023-05-22  发布在  其他
关注(0)|答案(7)|浏览(244)

当我在Microsoft Visual C中使用strdup时,它警告我:
警告C4996:'strdup':不推荐使用此项的POSIX名称。请使用符合ISO C
的名称:_strdup。有关详细信息,请参阅联机帮助。
所以_strdup是正确的。
但是当我在GCC(Fedora Linux OS)中使用_strdup时,编译器显示一个错误:
错误:未在此作用域中声明“_strdup”
对于GCC和Linux,编译器不会显示任何strdup错误。
哪个是正确的-strdup_strdup
注意:我在代码中包含了<string.h>

xnifntxz

xnifntxz1#

哪个是正确的?
strdup是一个完全正确的POSIX函数。尽管如此,它不属于标准,ANSI C标准保留了一些(广泛的)函数名类以供将来使用。其中,有

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

因此,微软的人决定用_strdup替换strdup
继续使用strdup。C委员会不太可能将strdup定义为POSIX以外的东西。#define strdup _strdup或使警告静音。
顺便说一句,我希望你看到这也适用于你的函数,比如string_list等等。

doinxwow

doinxwow2#

strdup不是标准的C++函数。但它显然是一个POSIX函数,而且无论如何,它是一个自K&R C以来就存在的 * 众所周知的函数 *。因此,如果您必须使用它,不要担心任何可能的名称冲突,只需编写strdup以获得最大的可移植性。

iecba09b

iecba09b3#

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

ukqbszuj

ukqbszuj4#

如果您只想避免警告消息:
项目->属性-> C/C++ ->预处理器->预处理器定义
编辑此内容,并添加
_CRT_NONSTDC_NO_弃用

xe55xuns

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

  • 使用系统相关宏(例如_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

ubbxdtey

ubbxdtey6#

我不知道C++。
C Standard不描述任何具有strdup名称的函数(尽管该名称是保留的)。为了便于移植,在C中,最好用mallocstrcpyfree替换它。

vltsax25

vltsax257#

这不是一个警告,而是一个错误报告在更高版本的vs.
使用宏#ifdef WIN32切换

相关问题