【问题标题】:error when using g++: 'malloc' was not declared in this scope使用 g++ 时出错:未在此范围内声明“malloc”
【发布时间】:2012-07-11 03:31:41
【问题描述】:

我正在练习 g++ 来编译我的代码,但错误“malloc 未在此范围内声明”一开始就不断出现。我与此错误相关的代码如下所示:

/*------Basic.h--------*/
using namespace std;

/*------A.h------------*/
class A{
 private:
  double* _data;
 public:
 A(int N);
}

/*------A.cpp----------*/
A::A(int N){
  _data=(double*)malloc(N*sizeof(double));
}

当我使用 Microsoft Virtual Stdio 时,这个问题从未出现过。因此,我尝试添加一行

#include <stdlib.h>

到 Basic.h,错误消失。现在我想知道为什么会发生这种事情。 “命名空间std”不是已经包含stdlib.h了吗?非常感谢。

【问题讨论】:

标签: c++ namespaces g++ malloc


【解决方案1】:

命名空间和包含文件是两个完全不同的东西。你需要

#include <stdlib.h>

或者,等价的,

#include <cstdlib>

为了访问该头文件中的声明。

你的使用声明

using namespace std;

另一方面,意味着您可以使用属于命名空间std的标识符,即在内部声明的标识符

namespace std {
  /*...*/
}

每次都没有前缀 std::

例如,如果您include &lt;string&gt;,则可以使用数据类型std::string,但如果您添加using namespace std;,则可以使用该数据只需输入string

但请注意,malloc 未在任何命名空间内定义,因此要使用它,您只需包含 stdlib.h

注意stdlib.hcstdlib的区别见here

【讨论】:

    【解决方案2】:

    malloc()&lt;cstdlib&gt; 中定义,因此您必须将其包含在文件顶部。

    using namespace std; 只是告诉编译器您正在使用该特定命名空间,与包含任何库方法无关。

    无论如何,在使用 C++ 时,您确实应该使用 new 而不是 malloc 进行动态分配。

    【讨论】:

    • stdlib.h 是 cstdlib 的完美替代品。使用哪个主要是一种风格,并且与您在代码中是否使用更多的 C 或 C++ API 有更多关系。同样,关于 new 与 malloc 的全面声明并没有真正的帮助。对于那种迂腐的人来说,C++ 是一种过于宽泛的语言。
    • @AndyRoss:malloc 分配原始内存,new 分配内存并正确构造对象。 C++ 必然需要区分。大多数时候,人们想要一个新对象,而不是原始内存。
    • 为什么在 Microsoft Vitual Stdio 中没有任何问题? VC 是否将 cstdlib 设置为默认值?谢谢。
    【解决方案3】:

    using namespace std; 告诉编译器,我正在“使用”std 命名空间,所以假装我在 std 命名空间中进行查找并且不要让我每次都说std::

    问题在于,std 命名空间中没有任何东西(还)!

    您需要 #include 标头以声明 malloc

    即便如此,它也是全球性的——不在std

    【讨论】:

      【解决方案4】:

      使用“新”进行内存分配。 'using namespace std' 与 stdlib.h 无关 如果您仍想使用 malloc() 将其添加到顶部

      #include<cstdlib>
      

      祝你好运!

      【讨论】:

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