2010-02-21 52 views
9

Tôi đang cố gắng tìm hiểu C++ nhưng hầu hết các hướng dẫn và cuốn sách tôi đã đọc hoặc nhìn lên dạy bạn điều này C++ ...bị trình biên dịch phù hợp với

(Tôi giả định giống như hầu hết các hướng dẫn, họ đang giảng dạy tại đầu đến mã hoặc trong win32 console hoặc CLR console. trong cả hai trường hợp sau đây không hoạt động.)

#include <iostream> 
int main() 
{ 
    std::cout << "Hello World\n"; 
    return (0); 
} 

các IDE mà tôi có là Visual C++ 2008 Express edition và họ chấp nhận mã như thế này

#include "stdafx.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

Hoặc như thế này

#include "stdafx.h" 

using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 
    return 0; 
} 

Thành thật mà nói tôi không không có sự khác biệt về không ai trong số những điều này và tôi không chắc chắn nếu tôi chỉ cần tải về một trình biên dịch cũ để nó hoạt động. Nếu ai đó có thể cho tôi biết sự khác biệt trong những điều này là gì và đi đâu từ đó. Điều đó sẽ giúp ích rất nhiều. Cảm ơn [Đã chỉnh sửa]

Tôi đang cố gắng làm một thế giới chào đơn giản. Nhưng tôi nhận được lỗi "hệ thống không thể tìm thấy đường dẫn chỉ định." Tôi có ảnh chụp màn hình cho thấy lỗi trông như thế nào. Nó cũng nói rằng dự án của tôi đã lỗi thời khi tôi lưu tệp trước khi tôi tạo nó. Rõ ràng nó không thể tìm thấy tập tin thực thi. Tôi đã đi đến gỡ lỗi lần và không thấy bất kỳ tập tin exe.

Screenshot

Screenshot

[Edited]

Ok, bây giờ Khi tôi cố gắng xây dựng các dự án tôi nhận được các lỗi sau đây

1>------ Rebuild All started: Project: test, Configuration: Debug Win32 ------ 
1>Deleting intermediate and output files for project 'test', configuration 'Debug|Win32' 
1>Compiling... 
1>stdafx.cpp 
1>Compiling... 
1>test.cpp 
1>c:\users\numerical25\desktop\test\test\test.cpp(1) : warning C4627: '#include <iostream>': skipped when looking for precompiled header use 
1>  Add directive to 'stdafx.h' or rebuild precompiled header 
1>c:\users\numerical25\desktop\test\test\test.cpp(6) : error C2653: 'std' : is not a class or namespace name 
1>c:\users\numerical25\desktop\test\test\test.cpp(6) : error C2065: 'cout' : undeclared identifier 
1>Build log was saved at "file://c:\Users\numerical25\Desktop\test\test\Debug\BuildLog.htm" 
1>test - 2 error(s), 1 warning(s) 
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ========== 

Đây là mã tôi đã sử dụng

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

int main() 
{ 
    std::cout << "Hello World\n"; 
    return (0); 
} 

Lưu ý: Tôi đã thử sử dụng nó có và không có #include "stdafx.h" Khi tôi thử nó mà không có #include "stdafx.h", nó nói rằng tôi có thể thiếu nó.

+2

Không thể không suy nghĩ về Dilbert: "Đây là một đứa trẻ nhàn rỗi ...": http://tomayko.com/writings/that-dilbert-cartoon. Không hoàn toàn công bằng, nhưng quá vui để vượt qua. Không biết cửa sổ, vì vậy tôi không thể đưa ra lời khuyên nghiêm túc nào. – dmckee

+0

stdafx.h phải là tiêu đề đầu tiên trong cpp. – Totonga

+0

Tôi đã cập nhật câu trả lời của mình là thuốc chữa bách bệnh. Vui lòng thay đổi * câu trả lời được chấp nhận * của bạn. :) –

Trả lời

7

Điểm nhỏ mà tôi không thấy ở đâu đó trong câu trả lời: Khi sử dụng các tiêu đề được biên dịch trước, chẳng hạn như stdafx.h, trước tiên bạn cần đưa chúng vào. Thay đổi nó thành:

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

và điều đó sẽ khắc phục lỗi. Ngoài ra, có thể dễ dàng tắt các tiêu đề được biên dịch trước: Dự án> Thuộc tính> Thuộc tính cấu hình> C/C++> Tiêu đề được biên dịch trước> Chuyển tùy chọn đầu tiên thành "Không sử dụng tiêu đề được biên dịch trước". Chúng có thể hữu ích cho các dự án lớn nhưng sẽ khó xử và khó chịu khi bạn đang học, vì chúng có các quy tắc bổ sung (như thế này "phải được đưa vào trước") mà không phải là yêu cầu của chuẩn C++.

+0

Tôi không thấy câu trả lời của bạn trước khi tôi tìm ra câu trả lời nhưng bạn đến gần nhất với những gì đã xảy ra. – numerical25

+0

cũng là một mẹo rất hữu ích để tắt các tiêu đề biên dịch sẵn – numerical25

+0

Đánh tôi với nó. Cuối cùng anh ấy đăng đủ thông tin sau một ngày để thực sự chẩn đoán những gì là sai, và bạn lẻn vào để giành chiến thắng! Chúc mừng. :) –

19

Không chắc chắn bạn đang hỏi gì. Hai ví dụ đầu tiên bạn đưa ra là các chương trình C++ hợp lệ cần (biên dịch) với VC++. Ví dụ thứ ba là một chương trình C++/CLI phải được biên dịch với trình chuyển đổi trình biên dịch/CLR (điều này được gọi là Managed C++).

EDIT: Thêm thông tin cụ thể hơn (từ một bình luận dưới đây):

Hai ví dụ đầu tiên là tiêu chuẩn (bản địa) C++ (mặc dù, ví dụ thứ hai có macro MS-độc quyền). Chúng biên dịch thành mã gốc. Thứ ba là C++/CLI (một phần mở rộng "managed" thành C++). Nó biên dịch thành mã được quản lý (.NET). Chỉ đoạn mã thứ ba tương tác với khung công tác .NET theo bất kỳ cách nào. Tất cả ba là hoàn toàn có thể xây dựng và runnable bằng cách sử dụng các dự án thích hợp trong VS 2008 (không có dòng lệnh cần thiết)!

Dựa trên bản cập nhật mới nhất của bạn, có vẻ như bạn có thể đã sửa đổi một số thuộc tính dự án và đã thay đổi một số đường dẫn. Ứng dụng đang xây dựng, nhưng khi bạn cố gắng chạy nó qua VS (bạn nên làm điều này với <Ctrl>+F5, bằng cách này), không thể tìm thấy tệp thi hành (có một số cách bạn có thể làm rối loạn điều này bằng cách thay đổi hoặc chơi với các cài đặt khác nhau).

Xin lưu ý sự khác biệt giữa xây dựng và chạy. Xây dựng là quá trình biên dịch và liên kết mã nguồn của bạn. Chạy đang khởi chạy kết quả thực thi. Bạn dường như bị nhầm lẫn giữa những điều này (đánh giá từ các khiếu nại của bạn về hộp thoại "... lỗi thời"). Việc nhận được hộp thoại "... lỗi thời" là bình thường nếu bạn cố gắng chạy mà không cần xây dựng lại sau khi bạn đã thực hiện thay đổi cho dự án (ngay cả khi thay đổi đó được lưu). Chỉ cần chắc chắn rằng bạn nhấp vào "có". Bạn cần xây dựng dự án trước khi bạn có thể chạy nó.

Đề xuất của tôi là xóa hoàn toàn dự án và giải pháp của bạn. Tạo một dự án trống mới, như được đề xuất ở đâu đó trong chuỗi này, và không sửa đổi bất kỳ cài đặt dự án nào. Nếu điều này không hoạt động, điều gì đó nghiêm trọng sai!

KHÁC EDIT: Chỉ cần hoàn thành, vì câu hỏi này liên tục thay đổi:

Như những người khác đã chỉ ra, vấn đề cuối cùng của bạn với đoạn đầu tiên là việc sử dụng tiêu đề precompiled (PCH). PCH được bật theo mặc định trong các dự án VS C++ mới. Mục đích của họ là tăng tốc biên dịch khi nhiều tệp triển khai bao gồm cùng một bộ tiêu đề - ngăn trình biên dịch phải phân tích cú pháp các tệp tiêu đề cho mỗi đơn vị biên dịch.

Bạn có ba lựa chọn:

  1. (Recommended) Vô hiệu hoá PCH - Project Properties -> Configuration Properties -> C/C++ -> precompiled Headers: Đặt Tạo/Sử dụng precompiled Tiêu đề để Không sử dụng các tiêu đề được biên dịch trước. (Bạn không cần phải làm bất kỳ điều gì với tệp "stdafx.h" hoặc #include cho tệp đó.)
  2. Đặt số thường dùng #include s trong "stdafx.h". Trong trường hợp của bạn, bạn sẽ đặt #include <iostream> trong "stdafx.h".
  3. Đặt số #include s sau `#include" stdafx.h "của bạn. Microsoft yêu cầu tệp "stdafx.h" là tệp được bao gồm đầu tiên trong một đơn vị biên dịch.
+2

Wow! Câu trả lời thực sự đúng! Điều đó dường như hiếm khi xảy ra với câu hỏi này. –

+0

Cảm ơn. Tôi khiêm tốn chấp nhận * upvote * của bạn (xin vui lòng). :) –

+0

Đã hoàn tất. Câu trả lời của bạn có 1 bên cạnh nó, phải không? :) –

0

_tmain với _TCHAR argv là cách thời gian chạy C cho phép bạn xử lý unicode. Nếu _UNICODE được xác định, thì _tmain sẽ mở rộng thành wmain và đối số _TCHAR sẽ thuộc loại wchar_t. Nếu _UNICODE không được xác định, thì _tmain sẽ mở rộng thành chính, tiêu chuẩn ANSI.

Do đó, miễn là _UNICODE không được xác định, đoạn mã thứ hai bạn đăng tuân thủ tiêu chuẩn.

+0

Cảm ơn bạn đã trả lời nhưng đó không phải là tôi đã hỏi. Những gì tôi đăng là 3 phiên bản của một ứng dụng giao diện điều khiển. Tôi đang cố gắng phân biệt 3. – numerical25

+0

Sau đó, hai cái đầu tiên là cả hai C++ hợp lệ sẽ biên dịch tốt, cái cuối cùng là một ứng dụng C++/CLR. –

+0

Nếu đúng như vậy, câu trả lời của STingRaySC là câu trả lời bạn đang tìm kiếm. –

-1

Tải xuống và cài đặt Dev-C++ trên hệ thống của bạn. Nếu mã không hoạt động trên Visual C++, hãy thử nó trên Dev-C++ (sử dụng trình biên dịch GCC). Bạn có thể nhận được kết quả tương tự hoặc thông báo lỗi khác. Bất cứ khi nào bạn nhận được thông báo lỗi mà bạn không hiểu, hãy thực hiện tìm kiếm trên Internet cho thông báo lỗi.

+1

-1: Không trả lời câu hỏi. Hơn nữa, chỉ có đoạn đầu tiên sẽ xây dựng trên một thực hiện không MS. OP đã cố gắng sử dụng VS - anh ta không cần phải thực hiện một môi trường phát triển khác chỉ để biên dịch "hello world". –

+0

Bài đăng của tôi là nhằm vào tiêu đề, "nhận được trình biên dịch phù hợp cho C++", chứ không phải là câu hỏi khó hiểu (nếu có). –

+1

Đủ công bằng, nhưng đó không phải là vấn đề của anh ấy/cô ấy. (S) Anh ta có trình biên dịch C++ hoàn toàn tốt. –

1

STingRaySC pointed out, tất cả ba ví dụ của bạn sẽ được biên dịch trong VC2008 express; nó chỉ là ví dụ 2 và 3 là những gì VC2008 Express sẽ tải lên ban đầu khi bạn tạo một dự án (một trong những ví dụ là cho Managed C++, như STingRaySC đã đề cập).

Bạn chỉ có thể xóa mã trong ví dụ thứ hai của mình (dự án Ứng dụng giao diện điều khiển Win32 C++) và dán vào chương trình hello world chuẩn hơn từ ví dụ đầu tiên của bạn. Nó sẽ biên dịch và chạy tốt trong VC2008 Express - nó đã làm cho tôi.

2
int main(); 
int main(int argc, char* argv[]); 

Đây là C++ chuẩn.

int _tmain(int argc, _TCHAR* argv[]); 
int wmain(int argc, wchar_t* argv[]); 

Đây là những đặc trưng cho Windows để xử lý đối số Unicode. Xem What is the difference between _tmain() and main() in C++?.

int main(array<System::String^>^ args); 

Đây là không C++. Đây là C++/CLI.

Để có tính di động tốt nhất, hãy luôn sử dụng biểu mẫu đầu tiên.


Ngoài ra,

int main(int argc, char** argv, char** envp); 

Đây là một phần mở rộng POSIX thường thấy. Windows cũng hỗ trợ hình thức chính này. envp có nghĩa là các biến môi trường (trỏ tới).

int main(int argc, char** argv, char** envp, char** apple); 

Điều này chỉ dành cho máy Mac.

void main(); 

Và điều này sai (không chuẩn, một số trình biên dịch (ví dụ: gcc) sẽ từ chối).

+0

'void main()' được chấp nhận bởi một số trình biên dịch dưới dạng phần mở rộng không chuẩn. Vì vậy, bạn đã bỏ lỡ một chỗ! –

+1

@STingRaySC: Nó hoạt động ở mọi nơi nhưng nó sai. http://homepages.tesco.net/J.deBoynePollard/FGA/legality-of-void-main.html – kennytm

+0

Từ liên kết của bạn: * Vì vậy, nếu tài liệu của trình biên dịch xảy ra để nói bất cứ nơi nào mà chính có thể có loại trả về void sau đó chính thực sự có thể có kiểu trả về void và một chương trình có void main() là một chương trình phù hợp. * Chính xác thì "sai" về điều này là gì? Nó không còn "sai" hơn MS định nghĩa 'wmain' như là một điểm vào! –

2

Visual C++ Express sẽ biên dịch ví dụ đầu tiên tốt. Tuy nhiên, bạn cần phải đảm bảo các thiết lập dự án thích hợp:

  1. Tạo một "dự án rỗng"
  2. "Thêm một mục mới ..." để dự án thông qua menu "Dự án". Chọn tệp C++ (.cpp).
  3. Sao chép/dán mã vào tệp mới
  4. Bấm F5 để biên dịch và chạy.
  5. Khi "Dự án đã quá hạn" sẽ xuất hiện, nhấn "Yes" (xây dựng dự án)

Các bước trên đảm bảo VC++ Express không đối xử với tập tin của bạn như một ứng dụng đặc biệt giao diện điều khiển Win32/Windows.

EDIT: đã thêm bước 5 để ngăn hộp thoại "Không thể tìm thấy ...". Tôi đã quản lý để nhận được cùng một hộp thoại bằng cách đảm bảo tệp exe không tồn tại và trả lời "Không" cho hộp thoại xây dựng. Với một dự án trống, sạch, tệp exe chưa tồn tại. Nó phải được xây dựng trước. Nếu bạn trả lời "không" không xây dựng nó, VC + + dutifully không xây dựng exe và sau đó than phiền về việc không thể tìm thấy nó khi nó cố gắng để chạy nó sau này.

+0

Tôi sẽ thử điều đó nhưng đây là điều. Nếu bạn nhìn vào hình ảnh thứ hai trong câu hỏi của tôi. nó nói nó không thể tìm thấy debug/www.exe. Khi tôi nhìn vào thư mục, tôi không thấy tệp thi hành. Là một giả sử được tạo ra tại thời gian biên dịch ?? nếu vậy, tại sao nó không ở đó? – numerical25

+0

Tôi đã thêm một bước bổ sung mà tôi thường bỏ qua (cài đặt của tôi tự động tạo.) Xin lưu ý rằng tôi đã nhận được mã chính xác để biên dịch bằng các bước của tôi và tôi cũng đã sao chép hộp thoại "Không thể tìm thấy ..." của bạn. – Leftium

+0

@ numerical25: để trả lời câu hỏi của bạn, có "www.exe" là tệp thi hành và nó sẽ được tạo khi bạn xây dựng. Nếu nó không phải là, sau đó xây dựng là không vì một lý do nào đó. Bạn có thể cho chúng tôi biết những gì hiển thị trong cửa sổ "đầu ra" khi bạn cố gắng xây dựng? –

4

"Sự khác biệt" là thực tế. Cái sau chỉ là Microsoft-specificentry points.

Khi bạn đang học C++, tôi khuyên bạn nên sử dụng trình biên dịch và tốt nhất là hệ điều hành cho phép bạn tập trung vào C++ chứ không phải nền tảng. Đối với điều này tôi khuyên bạn nên g++, trên bản phân phối Linux chẳng hạn như Ubuntu.

Hãy thử this tutorial, có nhiều cách khác tương tự nhanh chóng cho phép bạn khắc phục sự cố với công cụ và tập trung vào C++.

+5

Một hệ điều hành hoàn toàn mới có phần là một chiếc búa tạ để crack một hạt. Không có gì ngăn cản việc biên dịch mã ISO C++ trên VC++ 2008 Express. Tôi không nghĩ anh ta cần một hướng dẫn khác. – Clifford

+1

Phần cuối cùng là C++/CLI, là ngôn ngữ mới của nó, tuy nhiên gần với C++. – kriss

+2

Có, tuy nhiên ở vị trí của mình, tôi có 2 mối quan tâm chính: Tối thiểu C++ phải được học (không đề cập đến CLR/CLI, hoặc thậm chí là Windows), và thứ hai là IDE chỉ làm lộn xộn suy nghĩ trong việc học một ngôn ngữ . Việc sử dụng C++ trở nên liên kết với Visual Studio và một dạng phụ thuộc. Không có VS và lập trình viên không thể tạo ra C++. Đây là việc học MSVC++, không thuần khiết C++. Nhà phát triển C++ ** phải ** hiểu mọi thứ từ giao diện cuộc gọi của hệ điều hành trở lên để có hiệu lực. –

0

Rất nhiều tẩy lông trữ tình và một số thông tin sai lệch cho bạn đã sàng lọc, nhưng tôi khuyên bạn nên làm theo lời khuyên của wonsungi. Tuy nhiên, để làm rõ lời khuyên của ông:

  1. File-> New-> Project Loại
  2. Chọn Dự án "Win32", sau đó mẫu "Dự án điều khiển Win32"
  3. Đưa dự án một tên và vị trí
  4. OK
  5. Chọn "Cài đặt ứng dụng"
  6. Kiểm tra "Empty Project"
  7. Trong "Solution Explorer", kích chuột phải vào "Nguồn" thư mục, sau đó Add-> New Item
  8. Nhập tên tệp, trong hộp "tên" bằng phần mở rộng .cpp (bạn có thể bỏ qua các mẫu nếu bạn muốn).
  9. Nhập mã của bạn vào tệp mới.
1

I. precompiled tiêu đề

#include "stdafx.h" 

là một số loại công cụ phức tạp mà đến theo cách của bạn. Nếu bạn tạo một dự án VC thường sẽ chuyển sang tiêu đề biên dịch trước. Điều này có nghĩa là một tiêu đề stdafx.h được tạo chỉ được biên dịch một lần. Điều này được thực hiện để tăng tốc thời gian biên dịch trong môi trường lớn. Nếu bạn bắt đầu C++ nó sẽ gây nhầm lẫn cho bạn. Nếu bạn sử dụng stdafx.h nó đầu tiên tiêu đề trong tệp cpp.

II. Unicode (Utf16)

int _tmain(int argc, _TCHAR* argv[]) 

Microsoft sử dụng UTF16 để thực hiện chuỗi unicode. Điều này có nghĩa là bạn nhận được hai phiên bản chính.

int main(int argc, char* argv[]) 
int main(int argc, wchar_t* argv[]) 

Điều này cũng gây nhầm lẫn nếu bạn bắt đầu.

Để bắt đầu, bạn có thể sử dụng bất kỳ trình soạn thảo nào bạn muốn. Tạo tệp. Mở cửa sổ nhắc lệnh Visdual studio 2008

cl main.cpp 
main.exe 

và bạn sẽ thấy Hello World sử dụng mã từ sách. Sau đó cố gắng hiểu một số cài đặt của VC.

Nhưng bạn phải luôn sử dụng một dự án trống. Khác bạn phải quan tâm đến stdafx, UNICODE, ...

+0

bạn có quyền bao gồm #include "stdafx.h" – numerical25

0

Woot !! Tôi đã hiểu rồi!!! Dưới đây là mã ban đầu của tôi

#include <iostream> 
int main() 
{ 
    std::cout << "Hello World\n"; 
    return (0); 
} 

Nó thiếu tệp tiêu đề #include "stdafx.h". Vì vậy, tôi đã bao gồm nó trong đó vì vậy tôi đã thêm nó như thế này

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

int main() 
{ 
    std::cout << "Hello World\n"; 
    return (0); 
} 

Tôi vẫn gặp lỗi như những gì bạn thấy trong câu hỏi đã chỉnh sửa ở dưới cùng. Vì vậy, những gì tôi đã làm là tôi đã #include và thêm nó vào tập tin tiêu đề của tôi và sau đó nó làm việc !!!!!

Ngay cả những cuốn sách và nhiều hướng dẫn hiển thị để thêm #include vào cpp thực tế, vì một lý do nào đó trong ấn bản nhanh tôi phải thêm nó vào tiêu đề để nó hoạt động. Tôi không biết TẠI SAO nhưng nó là một giải pháp và bây giờ nó hoạt động.

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