2013-05-31 109 views
5

Vì vậy, tôi có câu hỏi này. Tại sao cout némC++ cout cung cấp số nhận dạng không khai báo

error C2065: 'cout' : undeclared identifier 

Tôi đang sử dụng Visual Studio 2012 làm IDE và tôi đang viết một dự án trường học. Tôi đã hoàn thành mọi thứ trừ một tệp ví dụ. Vì vậy, tôi đang cố gắng viết một cái gì đó trên màn hình như thế này:

#include "iostream" 
#include "stdafx.h" 
using namespace std; 

int main() 
{ 
    cout<<"example"; 

    return 0; 
} 

Vì vậy, vấn đề là với cout ... printf hoạt động tốt, nhưng tôi muốn sử dụng cout.

CHỈNH SỬA: Tôi đã thay đổi "" thành <> nhưng nó không giúp ích gì. Ngoài ra tôi đang sử dụng mã này chỉ cho ví dụ ... Đây không phải là toàn bộ dự án.

+0

Hãy thử '#include ' –

+0

Và sử dụng 'std :: cout' hoặc sử dụng không gian tên. – Dirk

+4

Tôi tin rằng tiêu đề được biên dịch trước phải là dòng đầu tiên trong nguồn. – chris

Trả lời

12

stdafx.h sẽ là chỉ thị bao gồm đầu tiên trong tệp nguồn của bạn.

Chuyển đổi tệp và chuyển đổi tệp thứ hai bao gồm thành <>, như được đề xuất khác.

#include "stdafx.h" 
#include <iostream> 

Xem this post để biết thêm thông tin.

+1

thx, tôi chỉ phát hiện ra một mình, nhưng bạn là người duy nhất có sửa lỗi thực tế: D: D – Dekay

+0

@ user2440586, Để công bằng, * tốt hơn rất nhiều khi sử dụng dấu ngoặc nhọn khi bao gồm tiêu đề chuẩn. – chris

11

Trước hết:

#include <iostream> 

thay vì #include "iostream"

Thứ hai, nó thường được coi là xấu thực hành để viết using namespace std;, mặc dù hầu hết các khóa học bắt đầu với điều đó. Nó là tốt hơn để chỉ sử dụng những gì bạn thực sự cần, trong trường hợp của bạn:

using std::cout;

+2

Không cần "Thứ hai". Ông đã sử dụng đã "sử dụng không gian tên std;" – Tik0

+2

oops, nội dung xấu của tôi ... đã xóa –

+0

Câu hỏi đặt ra là tại sao nó không thành công khi tìm kiếm "" khi không thành công. – chris

4
#include "iostream" 

nên

#include <iostream> 

Trích dẫn từ bài viết này: difference-between-iostream-and-iostream-quotes-in-include

By kê biếu không của @ Câu trả lời của Jerry Coffin:

Khi bạn sử dụng <>, trình biên dịch chỉ tìm trong thư mục/thư mục được hệ thống chỉ định (ví dụ: bất kỳ thứ gì bạn đã đặt trong biến môi trường bao gồm) cho tiêu đề.

Khi bạn sử dụng "", trình biên dịch tìm trong thư mục cục bộ trước tiên và nếu không thành công, hãy tìm kiếm lại giống như bạn đã sử dụng <>. Về mặt kỹ thuật, (tức là, theo tiêu chuẩn) không phải là thư mục "cục bộ", nhưng đó là cách nó hoạt động trong mọi trình biên dịch mà tôi biết).

EDIT:

Tuy nhiên, nguyên nhân gốc rễ là stdafx.h là một tiêu đề biên dịch sẵn. Visual C++ sẽ không biên dịch bất kỳ thứ gì trước tệp #include "stdafx.h" trong tệp nguồn, trừ khi tùy chọn biên dịch /Yu'stdafx.h' không được chọn (theo mặc định); nó giả định tất cả các mã trong nguồn lên đến và bao gồm cả dòng đó đã được biên dịch. Tuy nhiên, vẫn tốt hơn khi sử dụng <> với iostream không làm người đọc nhầm lẫn mã.

+1

Vấn đề tôi thấy là bạn mâu thuẫn với câu trả lời của bạn với báo giá. Tiền của tôi là vấn đề PCH. – chris

+0

@chris Tôi nghĩ câu cuối cùng 'nhưng đó là cách nó hoạt động trong bản chất mọi trình biên dịch mà tôi biết' báo giá củng cố câu trả lời của mình. Cảm thấy tự do để sửa tôi nếu bao gồm cả báo giá là không thích hợp, cảm ơn! – taocp

+0

Tôi tin rằng anh ta đang tham chiếu một thực tế rằng '#include" name "' tìm kiếm theo cách được định nghĩa thực hiện trước khi quay trở lại '#include ', nhưng mọi trình biên dịch sane đều nhìn vào thư mục cục bộ. – chris

1

Nếu bạn sử dụng #include <iostream> với số <> thay vì "" thì nó sẽ hoạt động. Ngay bây giờ, trình biên dịch không biết nơi để tìm thư viện iostream.

Ngoài ra, bạn có thể muốn thay đổi cout<<"example"; thành cout<<"example"<<endl; cho một dòng mới để định dạng chính xác.

+2

Nếu bạn chỉ đang cố thêm một dòng mới, thì chỉ cần khuyên thêm một dòng mới: '<< '\ n';'. Nếu bạn đang cố gắng để tuôn ra cũng có, bạn nên ghi rõ điều đó. – BoBTFish