Microsoft Visual C++でstrdup
を使用すると、警告が表示されます。
警告C4996: 'strdup':このアイテムのPOSIX名は廃止されました。代わりに、ISO C++準拠の名前_strdupを使用します。詳細については、オンラインヘルプを参照してください。
したがって、_strdup
正しい。
しかし、_strdup
GCC(Fedora Linux OS)では、コンパイラーはエラーを表示します。
エラー:「_strdup」はこのスコープで宣言されていません
GCCおよびLinuxでは、コンパイラはstrdup
に対してエラーを表示しません。
どちらが正しいか-strdup
または_strdup
?
注:<string.h>
私のコードで。
strdup
は標準C++関数ではありません。しかし、それは明らかにPosix関数であり、とにかくK-R C以降に存在するよく知られている関数ですので、絶対に使用する必要がある場合は、名前の衝突の可能性について心配しないで、 strdup
は移植性を最大限にします。
どちらが正しい?
strdup
は完全に正しいPOSIX関数です。それにもかかわらず、それは標準に属していません、そして、ANSI C標準はさらなる使用のために関数名のいくつかの(広い)クラスを予約します。これらの中には、
したがって、MSのスタッフはstrdup
を_strdup
に置き換えることにしました。
引き続きstrdup
を使用します。 C委員会がstrdup
をPOSIX以外のものに定義することはまずありません。 #define strdup _strdup
または警告を黙らせます。
ところで、これがstring_list
などのような名前の関数にも当てはまることを願っています。
#define _ CRT_NONSTDC_NO_DEPRECATE を使用して、この警告を無効にすることができます。
警告メッセージを避けたい場合:
プロジェクト->プロパティ-> C/C++->プリプロセッサ->プリプロセッサ定義
これを編集して追加します
_CRT_NONSTDC_NO_DEPRECATE
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の間で移植可能なコードを書く必要がある場合:
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
C++について知らない。
C Standard は、strdup
という名前の関数を記述しません(名前は予約されています)。 Cで移植可能にするには、それをmalloc
、strcpy
、およびfree
に置き換えた方がよいでしょう。