web-dev-qa-db-ja.com

strdupまたは_strdup?

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

警告C4996: 'strdup':このアイテムのPOSIX名は廃止されました。代わりに、ISO C++準拠の名前_strdupを使用します。詳細については、オンラインヘルプを参照してください。

したがって、_strdup 正しい。

しかし、_strdup GCC(Fedora Linux OS)では、コンパイラーはエラーを表示します。

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

GCCおよびLinuxでは、コンパイラはstrdupに対してエラーを表示しません。

どちらが正しいか-strdupまたは_strdup

注:<string.h>私のコードで。

54
Amir Saniyan

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

29

どちらが正しい?

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

  • strおよび小文字で始まる関数名

したがって、MSのスタッフはstrdup_strdupに置き換えることにしました。

引き続きstrdupを使用します。 C委員会がstrdupをPOSIX以外のものに定義することはまずありません。 #define strdup _strdupまたは警告を黙らせます。

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

34
jpalecek

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

19
David Bremner

警告メッセージを避けたい場合:

プロジェクト->プロパティ-> C/C++->プリプロセッサ->プリプロセッサ定義

これを編集して追加します

_CRT_NONSTDC_NO_DEPRECATE

9
Darós

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

7
hdante

C++について知らない。

C Standard は、strdupという名前の関数を記述しません(名前は予約されています)。 Cで移植可能にするには、それをmallocstrcpy、およびfreeに置き換えた方がよいでしょう。

5
pmg