2012-07-11 68 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> 

祝你好運!