64

Microsoft Visual C++ で使用するstrdupと、次の警告が表示されます。

警告 C4996: 'strdup': この項目の POSIX 名は非推奨です。代わりに、ISO C++ 準拠の名前 _strdup を使用してください。詳細については、オンライン ヘルプを参照してください。

したがって、それ_strdupは正しいようです。

しかし_strdup、GCC (Fedora Linux OS) で使用すると、コンパイラにエラーが表示されます。

エラー: '_strdup' はこのスコープで宣言されていません

GCC と Linux を使用すると、コンパイラは のエラーを表示しませんstrdup

どちらが正しいですstrdup_strdup

注:<string.h>コードに含めます。

4

7 に答える 7

42

どちらが正しい?

strdup完全に正しい POSIX 関数です。それにもかかわらず、それは標準に属しておらず、ANSI C 標準では、将来の使用のために関数名のいくつかの (広範な) クラスが予約されています。これらの中には、

  • strと小文字で始まる関数名

したがって、MS の連中は に置き換えることにstrdupしました_strdup

私はそのまま使い続けstrdupます。C 委員会がstrdupPOSIX 以外のものを定義する可能性は低いです。#define strdup _strdupまたは警告を黙らせます。

ところで、これがなどの名前の関数にも当てはまることを願っていますstring_list

于 2011-09-28T11:46:23.160 に答える
34

strdup標準の C++ 関数ではありません。しかし、これは明らかに Posix 関数であり、K&R C 以来存在するよく知られた関数strdupであるため、絶対に使用する必要がある場合は、名前の衝突の可能性について心配する必要はなく、移植性を最大限に高めるように記述してください。

于 2011-09-28T11:28:49.220 に答える
26

#define _CRT_NONSTDC_NO_DEPRECATEを使用して、この警告を無効にすることができます。

于 2014-06-25T23:34:12.797 に答える
8

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

于 2012-11-27T01:16:53.713 に答える
5

C++についてはわかりません。

C 標準では、その名前を持つ関数は記述されていませんstrdup(名前は予約されています)。malloc移植可能にするために、C では、それを、strcpy、およびに置き換えたほうがよいでしょうfree

于 2011-09-28T11:21:40.177 に答える
0

これは警告ではなく、vs の上位バージョンで報告されたエラーです。

マクロ#ifdef WIN32を使って切り替える

于 2017-04-27T08:14:19.823 に答える