1

我正在练习 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了吗?非常感谢。

4

4 回答 4

3

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

#include <stdlib.h>

或者,等效地,

#include <cstdlib>

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

您的使用声明

using namespace std;

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

namespace std {
  /*...*/
}

std::无需每次都预先设置。

例如,如果您include <string>,您可以使用数据类型std::string,但如果您添加using namespace std;,您可以将该数据类型简单地用作string

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

注意和之间的区别stdlib.hcstdlib请参见此处

于 2012-07-11T03:38:35.750 回答
2

malloc()已定义,<cstdlib>因此您必须将其包含在文件的顶部。

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

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

于 2012-07-11T03:35:08.450 回答
1

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

问题是,命名空间中什么都没有std(还)!

您需要#include在标题中malloc进行声明。

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

于 2012-07-11T03:36:47.450 回答
0

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

#include<cstdlib>

祝你好运!

于 2012-07-11T03:40:15.670 回答