strdup还是_strdup?

Ami*_*yan 54 c c++ strdup visual-studio

当我strdup在Microsoft Visual C++中使用时,它警告我:

警告C4996:'strdup':不推荐使用此项目的POSIX名称.而是使用符合ISO C++的名称:_strdup.详细信息请参见在线帮助.

这似乎_strdup是正确的.

但是当我_strdup在GCC(Fedora Linux OS)中使用时,编译器显示错误:

错误:未在此范围内声明'_strdup'

使用GCC和Linux,编译器不会显示任何错误strdup.

哪个是正确的 - strdup或者_strdup

注意:我包含<string.h>在我的代码中.

jpa*_*cek 34

哪个是对的?

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

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

因此,MS球员决定更换strdup_strdup.

我只是继续使用strdup.C委员会不太可能定义strdup除POSIX之外的东西.要么#define strdup _strdup警告,要么使警告静音.

顺便说一下,我希望你看到这也适用于你的函数string_list等名称.


Che*_*Alf 29

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

  • 只需使用`-D_CRT_NONSTDC_NO_DEPRECATE`即可.它应该可以在任何地方工作,对于MSVC,它会使它闭嘴.它的唯一目的是在移植应用程序时惹恼用户.它可能还有一些用例,其中MSVCRT变体的行为与POSIX/C99变体的行为不同.我现在想不出任何东西 (16认同)
  • @ThomasGandor:`#ifdef`的一个替代方法是通过编译器的头文件搜索路径使用特定于编译器的头选择.`#define`的一个替代方法(因为宏不遵守范围)是使用`inline`转发器函数. (4认同)
  • @mnunberg:_snprintf()仔细检查文档. (4认同)
  • 问题是,在MSVC中存在过多的"符合POSIX标准的_foo.如果你想要"安静编译"(特别是在大型项目中),并且有可能将它移植到GCC,这是非常烦人的.例如_fileno, _isatty(使用Flex解​​析器生成器时)和许多其他系统函数.目前我在#ifdef _MSC_VER中添加了许多#defines,但我总是打开以获得更好的解决方案. (3认同)
  • 对于额外的精神错乱,VS2015会产生这些*错误*,您必须使用多个非标准#defines来恢复正常行为. (2认同)
  • 不,其中一些损坏的“弃用”警告现在实际上是错误,例如 open()。它不再只是设置 #defines 来消除虚假警告,现在如果您希望应用程序能够编译,则必须设置它们。我必须设置这些才能构建 zlib,这可能是世界上使用最广泛的三四个库之一。 (2认同)

小智 20

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


Dar*_*rós 9

如果您只是想避免警告消息:

Project-> property - > C/C++ - > Preprocessor - > Preprocessor Definitions

编辑它,然后添加

_CRT_NONSTDC_NO_DEPRECATE


hda*_*nte 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++标准,但这是错误的,因为它可以在C++标准上进行验证.它仅使用下划线前缀作为函数的"命名空间".

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

  • `MSVC`从不暗示`_strdup`属于C++标准!它只是说`_strdup`是符合C++标准的名称.正如你和其他人所说,`strdup`是`POSIX`系统使用的保留名称,因此MS认为它可以解决保留名称的问题 (10认同)

pmg*_*pmg 5

不了解C++.

C标准并没有描述与任何函数strdup名(虽然名字被保留).为了便于移植,在C,你最好用替换的是malloc,strcpyfree.

  • @pmg:10年后,“strdup”最终将进入下一个C标准:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf 但我猜在在C标准的世界里,10年的时间很快。 (2认同)