ฉันเริ่มต้นใน Visual C ++ และฉันต้องการทราบวิธีการเก็บหน้าต่างคอนโซล
เช่นนี้จะเป็นแอปพลิเคชัน "สวัสดีโลก" โดยทั่วไป:
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
เส้นที่ฉันขาดหายไปคืออะไร?
ฉันเริ่มต้นใน Visual C ++ และฉันต้องการทราบวิธีการเก็บหน้าต่างคอนโซล
เช่นนี้จะเป็นแอปพลิเคชัน "สวัสดีโลก" โดยทั่วไป:
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
เส้นที่ฉันขาดหายไปคืออะไร?
คำตอบ:
เริ่มต้นโครงการที่มีแทนเพียงCtrl+F5F5
หน้าต่างคอนโซลจะยังคงเปิดอยู่พร้อมกับPress any key to continue . . .
ข้อความหลังจากที่โปรแกรมออก
โปรดทราบว่านี่ต้องใช้Console (/SUBSYSTEM:CONSOLE)
ตัวเลือก linker ซึ่งคุณสามารถเปิดใช้งานได้ดังนี้:
CTRL-F5 และคำใบ้ของระบบย่อยทำงานร่วมกัน; พวกเขาไม่ใช่ตัวเลือกที่แยกจากกัน
(ความอนุเคราะห์จาก DJMorreTX จากhttp://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )
cin.get(),getchar(), system("pause")
หรือขยะอื่น ๆ การเปลี่ยนงานนี้
system("pause");
ในตอนท้ายของรหัสของคุณ มันสมเหตุสมผลและทำงานได้ดี
วิธีมาตรฐานคือcin.get()
ก่อนใบแจ้งยอดคืนสินค้าของคุณ
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
cin.get();
return 0;
}
_tmain
-1 ฉันจะลงคะแนนอีก -1 สำหรับcin.get()
แทนการวางเบรกพอยต์สำหรับ F5 หรือใช้ Ctrl F5 แต่ฉันอนุญาตให้ลงหนึ่งคะแนนเท่านั้น
_tmain
? นี่เป็นวิธีมาตรฐานในการเขียนแอปพลิเคชัน Windows ที่กำหนดเป้าหมายไปที่ระบบย่อยคอนโซล การเบี่ยงเบนจากมาตรฐานนั้นคือสิ่งที่จะเป็นการปฏิบัติที่ไม่ดี เห็นได้ชัดว่าไม่มีใครพูดถึงรหัสพกพาที่นี่ คำถามที่ว่า Visual C ++ และ_tmain
เป็นลายเซ็นที่ปรากฏในตัวอย่างรหัส ได้เวลาละทิ้งศาสนานี้แล้ว Windows เป็น "มาตรฐาน" โดยค่าเริ่มต้นและมีเหตุผลที่ดีมากสำหรับการปฏิบัติตามมาตรฐาน
_tmain
คือเพราะมันไม่จำเป็นทั้งหมดที่ไม่ได้มาตรฐาน ( มาตรฐานระหว่างประเทศ C ++ ต้องมีธรรมดาmain
) และเพราะมันใช้T
รูปแบบแมโครของ Microsoft ซึ่งเป็นภาวะแทรกซ้อนที่ไม่จำเป็นและ verbiage สำหรับการสนับสนุน Windows 9x tmain
ถ้าคุณรู้สึกว่าเบี่ยงเบนไปจากมาตรฐานคือการปฏิบัติที่ไม่ดีแล้วคุณควรอย่างยิ่งที่ได้ใช้ ไม่มีเหตุผลที่ดีสำหรับการใช้tmain
ยกเว้นสำหรับการหมุนรอบหรือสำหรับมืออาชีพสำหรับการแสดงความสามารถทั้งหมดของคน
ตัวเลือกอื่นคือการใช้
#include <process.h>
system("pause");
แม้ว่านี่จะไม่ได้พกพามากเพราะมันจะทำงานเฉพาะบน Windows แต่มันจะพิมพ์โดยอัตโนมัติ
กดปุ่มใดก็ได้เพื่อดำเนินการต่อ ...
system
<stdlib.h>
จะมีการประกาศใน
สำหรับโครงการ makefile โซลูชันที่ยอมรับล้มเหลวเนื่องจากข้อบกพร่องใน Visual Studio (ซึ่งมีอยู่อย่างน้อยจนถึงรุ่น 2012 - ฉันยังไม่ได้ทดสอบ 2013) ข้อผิดพลาดนี้เป็นรายละเอียดที่นี่
เพื่อให้หยุดชั่วคราวคอนโซลหลังจากโปรแกรมสิ้นสุดในโครงการ makefile ทำตามขั้นตอนเหล่านี้ (ซึ่งอาจแตกต่างกันไปสำหรับรุ่นอื่นที่ไม่ใช่ 2010 - 2012):
1) ส่งผ่าน- แก้ไข : ดูด้านล่าง/SUBSYSTEM:CONSOLE
ไปยังลิงเกอร์
2) เปิดไฟล์โครงการของคุณ (.vcxproj) ในโปรแกรมแก้ไขข้อความ
3) ด้านใน<project>
แท็กรูทใส่ต่อไปนี้
<ItemDefinitionGroup> <Link> <SubSystem>Console</SubSystem> </Link> </ItemDefinitionGroup>
4) โหลดโครงการในโซลูชันของคุณ
5) เรียกใช้โปรแกรมโดยไม่มีการดีบัก (CTRL + F5)
แก้ไข:
ตามความคิดเห็นของฉันด้านล่างการตั้งค่าตัวเลือกลิงเกอร์/SUBSYSTEM:CONSOLE
นั้นไม่เกี่ยวข้องกับโครงการ Makefile (และไม่จำเป็นต้องเป็นไปได้แม้แต่ในกรณีที่คุณใช้คอมไพเลอร์อื่นที่ไม่ใช่ MSVC) สิ่งที่สำคัญคือการตั้งค่าถูกเพิ่มลงในไฟล์. vcxproj ตามขั้นตอนที่ 3 ข้างต้น
/SUBSYSTEM:CONSOLE
ไปยังตัวเชื่อมโยงนั้นไม่เกี่ยวข้องจริง ๆ - ขั้นตอนที่ 3 เป็นสิ่งที่สำคัญ โปรดจำไว้ว่าคำตอบของฉันเกี่ยวข้องกับโครงการ makefile - ในโครงการ makefile IDE ไม่มีทางรู้ว่าคุณกำลังส่งอะไรไปยังตัวเชื่อมโยง (คุณอาจไม่ได้ใช้คอมไพเลอร์ที่มี/SUBSYSTEM:CONSOLE
ตัวเลือก) และเป็นโครงการ ตัวเองซึ่งติดตามว่ามันหมายถึงการเป็นโปรแกรมคอนโซล ฉันจะแก้ไขคำตอบของฉันตามนั้น
คุณสามารถใช้cin.get();
หรือcin.ignore();
ก่อนคำสั่งการส่งคืนเพื่อหลีกเลี่ยงการปิดหน้าต่างคอนโซล
เพียงใส่เบรกพอยต์บนวงเล็บปีกกาสุดท้ายของ main
int main () {
//...your code...
return 0;
} //<- breakpoint here
มันทำงานได้สำหรับฉันไม่จำเป็นต้องเรียกใช้โดยไม่ต้องดีบัก นอกจากนี้ยังดำเนินการ destructors ก่อนที่จะกดเบรกพอยต์เพื่อให้คุณสามารถตรวจสอบข้อความใด ๆ ที่พิมพ์บน destructors เหล่านี้หากคุณมี
เพียงเพิ่มเบรกพอยต์เข้ากับวงเล็บปิดของ_tmain
วิธีการของคุณ นี่เป็นวิธีที่ง่ายกว่าโดยที่คุณไม่ต้องเพิ่มรหัสเพื่อทำการดีบั๊ก
main()
วางเบรกพอยต์ในรั้งสิ้นสุดของ มันจะได้รับการสะดุดแม้จะมีหลายreturn
งบ ข้อเสียเพียงอย่างเดียวคือการโทรไปexit()
ไม่ถูกจับ
หากคุณไม่ได้แก้จุดบกพร่องให้ทำตามคำแนะนำในคำตอบ Zoidberg และเริ่มต้นโปรแกรมของคุณด้วยCtrl+ แทนเพียงF5F5
2 เซนต์ของฉัน:
ตัวเลือก 1: เพิ่มเบรกพอยต์เมื่อสิ้นสุด main()
ตัวเลือก 2: เพิ่มรหัสนี้ก่อนreturn 0;
:
std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
คุณต้องรวม<iomanip>
ไว้สำหรับstd::numeric_limits
เพียงเพิ่มระบบ ("หยุด") ที่ส่วนท้ายของรหัสก่อนส่งคืน 0 เช่นนี้
#include <stdlib.h>
int main()
{
//some code goes here
system("pause")
return 0;
}
int main()
{
//...
getchar();
return 0;
}
cin.get()
system("PAUSE")
หรือ ฉันไม่เคยได้ยินว่าคุณสามารถใช้return(0);
ฉันรวม#include <conio.h>
แล้วเพิ่มgetch();
ก่อนreturn 0;
บรรทัด นั่นคือสิ่งที่ฉันเรียนที่โรงเรียน วิธีการดังกล่าวข้างต้นที่นี่ค่อนข้างแตกต่างที่ฉันเห็น
มีปัญหาเดียวกัน ฉันใช้ _getch()
ก่อนแถลงการคืนสินค้า มันได้ผล.
(ตัวเลือกบางตัวอาจมีชื่อเรียกต่างกันฉันไม่ได้ใช้เวอร์ชั่นภาษาอังกฤษ)
ฉันมีปัญหาเดียวกันเมื่อฉันสร้างโครงการที่มีตัวเลือก "โครงการที่ว่างเปล่า" สร้างโครงการเป็น "แอปพลิเคชันคอนโซล Win32" แทน "โครงการที่ว่างเปล่า" ในกล่องโต้ตอบที่ปรากฏขึ้นตอนนี้คุณกด "ดำเนินการต่อ" และหลังจากนั้นคุณสามารถตรวจสอบตัวเลือก "โครงการที่ว่างเปล่า" และกดยืนยัน หลังจากนั้น CTRL + F5 จะเปิดคอนโซลที่ไม่ปิดโดยอัตโนมัติ
ผมมีปัญหาเหมือนกัน; ในใบสมัครของฉันมีจุดทางออกหลายจุด () และไม่มีวิธีที่จะรู้ว่ามันอยู่ที่ไหนแล้วฉันก็รู้เรื่องนี้:
atexit(system("pause"));
หรือ
atexit(cin.get());
วิธีนี้จะหยุดไม่ว่าเราจะออกจากที่ใดในโปรแกรม
atexit
ไม่มีผู้ที่มีการโทรที่ถูกต้อง atexit
ใช้ตัวชี้ฟังก์ชั่นไม่ใช่จำนวนเต็ม
ตัวเลือกอื่น:
#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif
ในหลัก:
int main(int argc, char* argv[]) {
MAINRET;
}
ที่จริงแล้วทางออกที่แท้จริงคือการเลือกแม่แบบโครงการเอง คุณต้องเลือก Win32 Console Application ใน VS ที่เก่ากว่าหรือกรอกชื่อโครงการก่อนแล้วคลิกสองครั้งที่ตัวช่วยสร้าง Windows Desktop แล้วเลือก Win32 console application จากนั้นเลือกโครงการที่ว่างเปล่า ณ จุดนี้ สิ่งนี้จะช่วยให้สิ่งที่ผู้ถามเดิมต้องการจริงๆโดยไม่ต้องเพิ่มจุดหยุดพิเศษและถือรหัส ฉันเจอปัญหานี้เช่นกัน คำตอบคือที่เว็บไซต์ MSDN
นี่คือวิธีที่จะทำให้หน้าต่างคำสั่งเปิดอยู่โดยไม่คำนึงถึงว่าจะหยุดการทำงานอย่างไรโดยไม่ต้องแก้ไขโค้ดใด ๆ :
ใน Visual Studio เปิดหน้าคุณสมบัติโครงการ -> การแก้จุดบกพร่อง
สำหรับCommandให้ป้อน$(ComSpec)
สำหรับข้อโต้แย้งคำสั่ง/k $(TargetPath)
ให้ใส่ ต่อท้ายอาร์กิวเมนต์ใด ๆ กับแอปพลิเคชันของคุณเอง
ตอนนี้F5หรือCtrl-F5ดำเนินการWindows / System32 / cmd.exeในหน้าต่างใหม่และ/ kทำให้มั่นใจได้ว่าพรอมต์คำสั่งยังคงเปิดอยู่หลังจากการดำเนินการเสร็จสมบูรณ์
ข้อเสียคือการดำเนินการจะไม่หยุดในจุดพัก
อย่างที่บางคนชี้ไปแล้ววิธีแก้ปัญหาของ Zoidberg ไม่ได้แนบตัวดีบั๊กซึ่งเป็นสิ่งที่คุณไม่ต้องการ
ตัวเลือกที่ดีที่สุดคือการกำหนดค่า VS ของคุณตามลำดับ (ตั้งแต่ VS 2017 เป็นต้นไป) โดยไปที่เครื่องมือ> ตัวเลือก> การดีบัก> ทั่วไป คุณยกเลิกการเลือก "ปิดคอนโซลโดยอัตโนมัติเมื่อทำการดีบั๊กหยุด" (ที่ด้านล่างสุด) ซึ่งอาจถูกตรวจสอบในกรณีของคุณ
คุณสามารถใส่ keep_window_open (); ก่อนที่จะกลับมาที่นี่เป็นตัวอย่างหนึ่ง
int main()
{
cout<<"hello world!\n";
keep_window_open ();
return 0;
}