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

using namespace std; 

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

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

Я получаю следующее сообщение об ошибке компиляции с г ++:Почему моя функция 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; 
} 

или вы можете переместить определение HelloWorld() перед тем main()

+0

, но вы может использовать член класса, прежде чем объявлять его. Поэтому это объяснение не удовлетворяет. – Walter

+14

@Walter Мое объяснение касается конкретно его проблемы, и поскольку он новый, нет смысла наводнять его такой информацией. – Nasreddine

2

Перестановка 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; } 'У нас есть проблема, но не если мы заменим' namespace' на 'class' (и добавим'; 'в конец). – Walter

8

Существует еще одна возможность для какой-то причине никто не упоминалось, а именно с помощью Экстерн декларации:

#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++, чтобы определить все другие функции перед основной функцией.

Смежные вопросы