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=... 传递)是“GNU C++”而不是“严格标准 C++”,因此“除了升级到 C++11 之外不要更改任何内容”的标志是 -std =gnu++0x,不是-std=c++0x;后者的意思是“升级到 C++11 并且比默认情况下更严格”。

于 2012-11-29T15:45:19.560 回答
8

strdup可能不包含在您链接的库中(您提到了 mingw)。我不确定它是否在 c++0x 中;我知道它不在早期版本的 C/C++ 标准中。

这是一个非常简单的函数,您可以将它包含在您的程序中(尽管将其简单地称为“strdup”是不合法的,因为所有以“str”和小写字母开头的名称都保留用于实现扩展。)

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”编译你的代码,它会起作用吗?

编辑:只是为了扩展一点,除了在 POSIX 系统上包含 cstring 之外,您可能不需要任何其他东西。但是你在 Windows 上使用 GCC,它不是 POSIX,所以你需要额外的定义来启用 strdup。

于 2011-04-07T12:47:12.970 回答
0

将此预处理器“_CRT_NONSTDC_NO_DEPRECATE”添加到 Project Properties->C/C++ Build->GCC C++ Compiler->Preprocessor->Tool Settings

不要忘记检查仅预处理器(-E)

这在 Windows mingw32 上对我有用。

于 2016-04-20T05:50:19.533 回答