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

using namespace std; 

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

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

Tôi nhận được lỗi biên dịch sau đây với g ++:Tại sao hàm HelloWorld của tôi không được khai báo trong phạm vi này?

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

Tôi thích cách câu hỏi này bắn thẳng lên StackExchange dưới dạng "Câu hỏi nóng". – surfasb

+2

có thể trùng lặp của [Tại sao nguyên mẫu được yêu cầu ngay cả khi không có khai báo lớp nào?] (Http://stackoverflow.com/questions/8199081/why-prototype-is-required-even-without-any-class-declaration) –

Trả lời

81

Bạn cần phải hoặc tuyên bố hoặc xác định các chức năng trước khi bạn có thể sử dụng nó. Nếu không, nó không biết rằng HelloWorld() tồn tại dưới dạng hàm.

Thêm điều này trước khi chức năng chính của bạn:

void HelloWorld(); 

Ngoài ra, bạn có thể di chuyển các định nghĩa của HelloWorld() trước khi bạn main():

#include <iostream> 
using namespace std; 

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

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

Bạn cần có hoặc là một nguyên mẫu của hàm trước gọi hoặc toàn bộ hàm trước nó.

Vì vậy, đầu tiên là:

void HelloWorld(); 

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

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

Và cách thứ hai là:

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

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

Bạn cần để chuyển tiếp tuyên bố HelloWorld() nên main biết nó là gì. Giống như vậy:

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

Bạn phải đặt chức năng trước chức năng chính.

19

Bạn phải khai báo các chức năng trước khi bạn có thể sử dụng nó:

#include <iostream> 

using namespace std; 

void HelloWorld(); 

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

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

hoặc bạn có thể di chuyển các định nghĩa của HelloWorld() trước main()

+0

nhưng bạn có thể sử dụng một thành viên lớp học trước khi bạn khai báo nó. Vì vậy, giải thích này là không thỏa mãn. – Walter

+14

@Walter Lời giải thích của tôi đề cập đến vấn đề của anh ta, và kể từ khi anh ta mới, không có điểm nào khiến anh ta ngập tràn quá nhiều thông tin. – Nasreddine

2

Sắp xếp lại HelloWorld() để nó xuất hiện trước main():

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

Tất cả các câu trả lời này là chính xác, nhưng kỳ lạ, điều này có thể đã hoạt động:

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

Không có gì lạ, tất cả các thành viên của lớp đã được định nghĩa bên trong phần thân của các hàm thành viên. –

+0

@Gene Thậm chí không rõ ràng (với người mới bắt đầu/người ngoài) tại sao trong 'không gian tên X {int a() {return b;} int b; } 'chúng ta có một vấn đề, nhưng không phải nếu chúng ta thay thế' namespace' bởi 'class' (và thêm'; 'ở cuối). – Walter

8

Có một khả năng hơn đối với một số lý do không ai đề cập, cụ thể là sử dụng khai extern:

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

Đó là một lợi thế khi bạn không muốn giới thiệu tên của hàm vào phạm vi không gian tên.

3

trong C++, bạn cần phải xác định hoặc ít nhất khai báo hàm trước khi gọi chúng.

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

Vì vậy, bạn cũng có thể cố gắng như thế này::

một cái gì đó như thế này Những gì bạn đang cố gắng làm cho đến bây giờ là

#include <iostream> 
using namespace std; 

void HelloWorld(); 

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

Đó là một thực hành tốt trong C++ để xác định tất cả khác chức năng trước chức năng chính.

Các vấn đề liên quan