g ++与c ++ 0x的strdup错误

时间:2011-04-06 22:34:53

标签: gcc c++11 g++ compiler-errors strdup

我有一些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 个答案:

答案 0 :(得分:8)

-std = gnu ++ 0x(而不是-std = c ++ 0x)对我有用; -D_GNU_SOURCE不起作用(我尝试使用交叉编译器,但也许它适用于其他类型的g ++)。

看来默认(没有-std = ...传递)是“GNU C ++”而不是“严格的标准C ++”,所以“除了升级到C ++ 11之外不要改变任何东西”的标志是-std = gnu ++ 0x,不是-std = c ++ 0x;后者意味着“升级到C ++ 11并且比默认更严格”。

答案 1 :(得分:6)

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

这是一个非常简单的函数,你可以把它包含在你的程序中(虽然把它简称为“strdup”是不合法的,因为所有以“str”开头的名字和一个小写字母都保留用于实现扩展。)< / p>

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;
}

答案 2 :(得分:2)

This page解释说strdup符合POSIX和BSD标准,并且GNU扩展实现了它。也许如果用“-D_GNU_SOURCE”编译代码,它可以工作吗?

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

答案 3 :(得分:0)

将此预处理器“_CRT_NONSTDC_NO_DEPRECATE”添加到项目属性 - > C / C ++ Build-&gt; GCC C ++编译器 - &gt;预处理器 - &gt;工具设置

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

这对我在windows mingw32上工作。