2012-07-11 37 views
1

我正在练习g ++编译我的代码,但错误“malloc未在此范围内声明”在开始时不断出现。我与这个错误代码片段看起来像:使用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)); 
} 

这个问题,当我使用微软的Virtual STDIO从未出现。因此,我试图在Basic.h中添加一行

#include <stdlib.h> 

,并且错误消失。现在我想知道为什么会发生这种事情。没有“命名空间标准”已包含stdlib.h?非常感谢。

+0

密切相关(几乎是重复的)http://stackoverflow.com/questions/3278864/what-is-the-difference-between-header-file-and-namespace – jogojapan 2012-07-11 03:49:11

+0

也在这里:http://stackoverflow.com /问题/ 5115556/C-using命名空间和包括。我将投票结束重复。 – jogojapan 2012-07-11 03:52:33

+0

避免在标题中使用指令。 – GManNickG 2012-07-11 06:07:14

回答

3

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

#include <stdlib.h> 

,或者等价地,

#include <cstdlib> 

,以获得访问声明在头文件。 using声明,另一方面

using namespace std; 

,意味着你可以使用那些被宣布里面

namespace std { 
    /*...*/ 
} 

,如果没有命名空间std,即部分标识符每次预先计划std::

例如,如果你include <string>,你可以使用的数据类型std::string,但如果你添加using namespace std;,您可以使用该数据类型仅仅作为string

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

注意对于stdlib.hcstdlib之间的区别,见here

2

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

using namespace std;只是告诉编译你正在使用那个特定的命名空间,并没有包括任何库方法。

在任何情况下,在使用C++时,您确实应该使用new而不是malloc进行动态分配。

+0

stdlib.h是cstdlib的完美替代品。要使用的主要是风格的事情,并且更多的与你的代码中是否使用更多的C或C++ API有关。同样,关于新vs malloc的一揽子声明并不真正有用。 C++对于那种儿童习惯而言是一种太广泛的语言。 – 2012-07-11 03:37:01

+0

@AndyRoss:'malloc'分配原始内存,'new'分配内存*并正确构造对象*。 C++必然需要分化。大多数时候,人们想要一个新的物体,而不是原始的记忆。 – GManNickG 2012-07-11 06:06:32

+0

为什么在Microsoft Vitual Stdio中没有错? VC是否将cstdlib设置为默认值?谢谢。 – 2012-07-12 04:21:27

1

using namespace std;告诉编译器,我“使用”的std命名空间,所以假装我在std命名空间查找,不要问我每次std::

麻烦的是,没有在std命名空间(还)!

您需要#include要声明的malloc的标题。

即使如此,它是全球性的 - 不在std

0

使用'new'进行内存分配。 “使用命名空间std”无关,与stdlib.h中 如果你仍然想使用malloc()添加这个顶部

#include<cstdlib> 

祝你好运!