7

C++0x コードがいくつかあります。以下で再現できました。以下のコードは問題なく動作-std=c++0xしますが、実際のコードには必要です。

C++0x に strdup を含めるにはどうすればよいですか? gcc 4.5.2 で

私はmingwを使用していることに注意してください。私はcstdlib、cstring、string.hを含めてみて、std::を使ってみました。運がない。

>g++ -std=c++0x a.cpp
a.cpp: In function 'int main()':
a.cpp:4:11: error: 'strdup' was not declared in this scope

コード:

#include <string.h>
int main()
{
    strdup("");
    return 0;
}
4

4 に答える 4

10

-std=gnu++0x (-std=c++0x の代わりに) がうまくいきます。-D_GNU_SOURCE は機能しませんでした (クロスコンパイラーで試しましたが、おそらく他の種類の g++ で機能します)。

デフォルト(-std = ...が渡されない)は「厳密な標準C ++」ではなく「GNU C ++」であるため、「C ++ 11へのアップグレード以外は何も変更しない」というフラグは-stdです-std=c++0x ではなく、=gnu++0x; 後者は「C++11 にアップグレードし、デフォルトよりも厳密にする」ことを意味します。

于 2012-11-29T15:45:19.560 に答える
8

strdupリンクしているライブラリに含まれていない可能性があります(mingwについて言及しました)。それが c++0x にあるかどうかはわかりません。以前のバージョンの C/C++ 標準には含まれていないことはわかっています。

これは非常に単純な関数であり、プログラムに含めることができます (ただし、"str" と小文字で始まる名前はすべて実装拡張用に予約されているため、単純に "strdup" と呼ぶことはできません)。

char *my_strdup(const char *str) {
    size_t len = strlen(str);
    char *x = (char *)malloc(len+1); /* 1 for the null terminator */
    if(!x) return NULL; /* malloc could not allocate memory */
    memcpy(x,str,len+1); /* copy the string into the new buffer */
    return x;
}
于 2011-04-06T22:46:19.490 に答える
2

このページでは、strdup が特に POSIX および BSD 標準に準拠していること、および GNU 拡張機能がそれを実装していることについて説明します。「-D_GNU_SOURCE」を指定してコードをコンパイルすると、うまくいくでしょうか?

EDIT : 少し拡張するだけですが、おそらく POSIX システムに cstring を含める以外に何も必要ありません。ただし、POSIX ではない Windows で GCC を使用しているため、strdup を有効にするには追加の定義が必要です。

于 2011-04-07T12:47:12.970 に答える
0

このプリプロセッサ "_CRT_NONSTDC_NO_DEPRECATE" を [プロジェクト プロパティ] -> [C/C++ ビルド] -> [GCC C++ コンパイラ] -> [プリプロセッサ] -> [ツール設定] に追加します。

Preprocessor Only(-E) をチェックすることを忘れないでください。

これは、Windows mingw32でうまくいきました。

于 2016-04-20T05:50:19.533 に答える