【问题标题】:strdup error on g++ with c++0x使用 c++0x 在 g++ 上出现 strdup 错误
【发布时间】:2011-07-31 05:37:40
【问题描述】:

我有一些 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;
}

【问题讨论】:

  • 适用于 gcc 4.5.1。尝试#include ` 并使用std::strdup,这就是“C++ 方式”。 (但仍然不是答案,因为这也应该是有效的,IIRC。)
  • @GMan:我修改了我的问题。我试过了,但没有运气:(。作为临时解决方案,我将 extern C _CRTIMP char* __cdecl __MINGW_NOTHROW strdup (const char*) __MINGW_ATTRIB_MALLOC; 放在我的标题中。它适用于此。

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


【解决方案1】:

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

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

这在 windows mingw32 上对我有用。

【讨论】:

  • 这是一个 MSVC 标志。
【解决方案2】:

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

似乎默认值(未通过 -std=...)是“GNU C++”而不是“严格标准 C++”,因此“除了升级到 C++11 之外不要更改任何内容”的标志是-std=gnu++0x,不是-std=c++0x;后者的意思是“升级到 C++11 并且比默认更严格”。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 保留但不标准!?
    • malloc 可能需要转换为 char * (stackoverflow.com/questions/5099669/…)
    • @Steve 这就是我将其编码为 C 的结果,因为它通常是 C 函数。是的,它需要在 C++ 中进行转换。
    • strdup 不在 ANSI C 中,#define 功能测试宏可能不是最佳选择,其他一些 strdup-like 可能需要其他功能测试 (_GNU_SOURCE, _BSD_SOURCE, .. .)。只需执行它。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多