我正在练习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,错误消失。现在我想知道为什么会发生这种事情。有没有“namespace std”已经包含stdlib.h?非常感谢。
答案 0 :(得分:3)
命名空间和包含文件是两个完全不同的东西。你需要
#include <stdlib.h>
或等同地
#include <cstdlib>
以便访问该头文件中的声明。
您的使用声明
using namespace std;
另一方面,意味着您可以使用属于命名空间std
的标识符,即在
namespace std {
/*...*/
}
每次都没有预先 std::
。
例如,如果您include <string>
,则可以使用数据类型std::string
,但如果您也添加using namespace std;
,您可以将该数据类型简单地用作string
。
但请注意,malloc
未在任何命名空间中定义,因此为了使用它,您只需要包含stdlib.h
。
注意有关stdlib.h
和cstdlib
之间的区别,请参阅here。
答案 1 :(得分:2)
malloc()
在<cstdlib>
中定义,因此您必须将其包含在文件的顶部。
using namespace std;
只是告诉编译你正在使用那个特定的命名空间,并且没有任何内容包括任何库方法。
在任何情况下,使用C ++时,您确实应该使用new
而不是malloc
进行动态分配。
答案 2 :(得分:1)
using namespace std;
告诉编译器,我正在“使用”std
命名空间,所以假装我在std
命名空间中进行查找强>并且不要让我每次都说std::
。
麻烦的是, {/ 1}}命名空间中还没有!
您需要std
声明#include
的标头。
即使这样,它也是全球性的 - 而不是malloc
。
答案 3 :(得分:0)
使用'new'进行内存分配。 'using namespace std'与stdlib.h无关 如果您仍想使用malloc(),请在顶部添加
#include<cstdlib>
祝你好运!