2011-11-22 58 views
45
#include <iostream> 

using namespace std; 

int main() 
{ 
    HelloWorld(); 
    return 0; 
} 

void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 

我正在以下編譯錯誤與G ++:爲什麼我的HelloWorld函數未在此範圍內聲明?

l1.cpp: In function 'int main()': 
l1.cpp:5:15: error: 'HelloWorld' was not declared in this scope 
+6

我喜歡這個問題是如何直接將StackExchange作爲一個「熱點問題」。 – surfasb

+2

可能的重複[爲什麼原型是需要的,即使沒有任何類聲明?](http://stackoverflow.com/questions/8199081/why-prototype-is-required-even-without-any-class-declaration) –

回答

81

您需要任何聲明或定義函數,然後才能使用它。否則,它不知道HelloWorld()作爲函數存在。

你的主函數之前添加此:

void HelloWorld(); 

或者,您可以前移動的HelloWorld()定義您的main()

#include <iostream> 
using namespace std; 

void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 

int main() 
{ 
    HelloWorld(); 
    return 0; 
} 
9

你需要有之前的原型功能調用或其之前的整個功能。

因此,第一個是:

void HelloWorld(); 

int main() { 
    HelloWorld(); 
    return 0; 
} 

void HelloWorld() { 
    cout << "Hello, World" << endl; 
} 

而第二個方法是:

void HelloWorld() { 
    cout << "Hello, World" << endl; 
} 

int main() { 
    HelloWorld(); 
    return 0; 
} 
15

您需要轉發聲明HelloWorld()所以main知道它是什麼。像這樣:

#include <iostream> 
using namespace std; 
void HelloWorld(); 
int main() 
{ 
    HelloWorld(); 
    return 0; 
} 
void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 
4

您必須將該功能放在主要功能之前。

19

您必須聲明函數之前,你可以使用它:

#include <iostream> 

using namespace std; 

void HelloWorld(); 

int main() 
{ 
    HelloWorld(); 
    return 0; 
} 

void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 

,或者你可以前main()

+0

但你可以在聲明它之前使用類成員。所以這個解釋並不令人滿意。 – Walter

+14

@Walter我的解釋特別包含了他的問題,而且因爲他是新人,所以沒有任何一點讓他充滿了這麼多的信息。 – Nasreddine

2

重新排列HelloWorld(),使其出現移動的HelloWorld()定義之前main()

#include <iostream> 
using namespace std; 
void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 
int main() 
{ 
    HelloWorld(); 
    return 0; 
} 
5

所有這些答案都是正確的,但奇怪的是,這將工作:

struct Hello { 
    static int main() { World(); return 0; } /* note: World() not declared yet */ 
    static void World() { std::cout<<"Hello World"; } 
}; 
int main() { return Hello::main(); } 
+1

沒有什麼奇怪的,這個類的所有成員都已經在成員函數體內定義了。 –

+0

@Gene對於'namespace X {int a(){return b;} int b;}來說,它並不立即顯而易見(對於初學者/外人來說) }'我們有一個問題,但是如果我們用'class'替換'namespace'(並且在末尾加上';'),就不會有問題。 – Walter

8

沒有爲所提到的,即使用extern聲明某種原因,沒有人多了一個可能性:

#include <iostream> 
using namespace std; 
int main() 
{ 
    extern void HelloWorld(); 
    HelloWorld(); 
    return 0; 
} 
void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 

,當你不希望引入該功能的名稱爲命名空間範圍很理想。

3

在C++中,您需要定義或至少在調用它們之前聲明這些函數。

你正在嘗試做的到現在爲止是這樣的:

int main() 
{ 
    cout << b; 
    int b = 10; 
} 

所以,你也可以嘗試這樣的:

#include <iostream> 
using namespace std; 

void HelloWorld(); 

int main() 
{ 
    HelloWorld(); 
    return 0; 
} 
void HelloWorld() 
{ 
    cout << "Hello, World" << endl; 
} 

,它在C++定義所有其他的好做法主要功能之前的功能。