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

using namespace std; 

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

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

estoy recibiendo el siguiente error de compilación con g ++:¿Por qué mi función HelloWorld no está declarada en este ámbito?

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

Me encanta cómo esta pregunta tomó el StackExchange como una "Pregunta caliente". – surfasb

+2

posible duplicado de [¿Por qué se necesita un prototipo incluso sin declaración de clase?] (Http://stackoverflow.com/questions/8199081/why-prototype-is-required-even-without-any-class-declaration) –

Respuesta

81

Usted necesitará o bien declarar o definir la función antes de poder utilizarlo. De lo contrario, no sabe que existe HelloWorld() como una función.

Añadir este antes de que su función principal:

void HelloWorld(); 

Como alternativa, puede mover la definición de HelloWorld() antes de main():

#include <iostream> 
using namespace std; 

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

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

Usted necesita tener ya sea un prototipo de la función antes de la invocación o toda la función antes de ella.

Así que la primera es:

void HelloWorld(); 

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

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

Y la segunda manera es:

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

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

Necesitas reenviar declaran HelloWorld() por lo main sabe lo que es. De la misma manera:

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

Tiene que poner la función antes de la función principal.

19

debe declarar la función antes de poder utilizarlo:

#include <iostream> 

using namespace std; 

void HelloWorld(); 

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

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

o puede mover la definición de HelloWorld() antes main()

+0

pero usted puede usar un miembro de la clase antes de declararlo. Entonces esta explicación no es satisfactoria. – Walter

+14

@Walter Mi explicación cubre específicamente su problema, y ​​como es nuevo, no tiene sentido inundarlo con tanta información. – Nasreddine

2

Reorganizar HelloWorld() para que aparezca antes main():

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

Todas estas respuestas son correctas, pero, curiosamente, esto hubiera funcionado:

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

No hay nada extraño, todos los miembros de la clase ya están definidos dentro del cuerpo de las funciones miembro. –

+0

@Gene No es inmediatamente obvio (para un principiante/forastero de todos modos) por qué en 'namespace X {int a() {return b;} int b; } 'tenemos un problema, pero no si reemplazamos' namespace' por 'class' (y agregamos'; 'al final). – Walter

8

Hay una posibilidad más, por alguna razón que nadie ha mencionado, a saber, el uso de declaración extern:

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

Es preferible cuando no desea introducir el nombre de la función en el ámbito del espacio de nombres.

3

en C++ debe definir o, al menos, declarar las funciones antes de llamarlas.

Lo que estamos tratando de hacer hasta ahora es algo como esto:

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

Así también se puede tratar de esta manera:

#include <iostream> 
using namespace std; 

void HelloWorld(); 

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

Es una buena práctica en C++ para definir todos los demás funciones antes de la función principal.

Cuestiones relacionadas