ไฟล์ที่ชื่อstdafx.h
จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อฉันเริ่มโครงการใน Visual Studio 2010 ฉันต้องสร้างไลบรารี C ++ ข้ามแพลตฟอร์มดังนั้นฉันจึงไม่ / ไม่สามารถใช้ไฟล์ส่วนหัวนี้ได้
อะไรคือสิ่งที่stdafx.h
ใช้? ตกลงไหมที่ฉันจะลบไฟล์ส่วนหัวนี้?
ไฟล์ที่ชื่อstdafx.h
จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อฉันเริ่มโครงการใน Visual Studio 2010 ฉันต้องสร้างไลบรารี C ++ ข้ามแพลตฟอร์มดังนั้นฉันจึงไม่ / ไม่สามารถใช้ไฟล์ส่วนหัวนี้ได้
อะไรคือสิ่งที่stdafx.h
ใช้? ตกลงไหมที่ฉันจะลบไฟล์ส่วนหัวนี้?
คำตอบ:
คอมไพเลอร์ C ++ ทุกตัวมีปัญหาประสิทธิภาพที่ร้ายแรงเพียงข้อเดียวในการจัดการ การคอมไพล์รหัส C ++ เป็นกระบวนการที่ยาวและช้า
รวบรวมหัวรวมถึงด้านบนของไฟล์ C ++ เป็นมากยาวกระบวนการที่ช้า รวบรวมโครงสร้างส่วนหัวใหญ่ว่ารูปแบบส่วนหนึ่งของ Windows API และห้องสมุด API ขนาดใหญ่อื่น ๆ เป็นอย่างมาก , มากยาวกระบวนการที่ช้า ที่จะต้องทำมันซ้ำแล้วซ้ำอีกและมากกว่าสำหรับทุกไฟล์ต้นฉบับ Cpp เดียวคือฆังมรณะ
นี่ไม่ใช่ของ Windows แต่เป็นปัญหาเก่าที่คอมไพเลอร์ทุกคนต้องคอมไพล์กับ API ขนาดใหญ่เช่น Windows
คอมไพเลอร์ Microsoft สามารถแก้ไขปัญหานี้ได้ด้วยเคล็ดลับง่ายๆที่เรียกว่าส่วนหัวที่คอมไพล์แล้ว เคล็ดลับนั้นค่อนข้างเรียบ: แม้ว่าไฟล์ CPP ทุกไฟล์สามารถให้ความหมายที่แตกต่างกันเล็กน้อยตามสายโซ่ของไฟล์ส่วนหัวที่รวมอยู่ด้านบนของไฟล์ Cpp แต่ละไฟล์ (โดยสิ่งต่าง ๆ เช่นมีมาโครที่แตกต่างกัน # define ก่อนล่วงหน้ารวมหรือ โดยการรวมส่วนหัวตามลำดับที่แตกต่างกัน) ซึ่งส่วนใหญ่ไม่ใช่กรณี ส่วนใหญ่เรามีไฟล์รวมหลายสิบหรือหลายร้อยไฟล์ แต่พวกเขาทั้งหมดตั้งใจที่จะมีความหมายเหมือนกันสำหรับไฟล์ Cpp ทั้งหมดที่รวบรวมในแอปพลิเคชันของคุณ
คอมไพเลอร์สามารถประหยัดเวลาได้อย่างมากหากไม่จำเป็นต้องเริ่มรวบรวมไฟล์ Cpp ทุกไฟล์รวมถึงมีไฟล์นับสิบตั้งแต่เริ่มต้นทุกครั้ง
เคล็ดลับประกอบด้วยการกำหนดไฟล์ส่วนหัวพิเศษเป็นจุดเริ่มต้นของกลุ่มการรวบรวมทั้งหมดไฟล์ที่เรียกว่า 'precompiled header' ซึ่งโดยทั่วไปจะเป็นไฟล์ชื่อstdafx.hเพียงเพื่อเหตุผลทางประวัติศาสตร์
เพียงแสดงรายการส่วนหัวขนาดใหญ่ทั้งหมดของคุณสำหรับ API ของคุณในไฟล์ stdafx.h ตามลำดับที่เหมาะสมจากนั้นเริ่มต้นไฟล์ CPP แต่ละไฟล์ของคุณที่ด้านบนสุดพร้อมกับ#include "stdafx.h"
ก่อนเนื้อหาที่มีความหมายใด ๆ ความเห็น)
ภายใต้เงื่อนไขเหล่านั้นแทนที่จะเริ่มต้นจากรอยขีดข่วนstdafx.h
คอมไพเลอร์จะเริ่มต้นรวบรวมจากผลการบันทึกไว้แล้วของการรวบรวมทุกอย่างใน
ฉันไม่เชื่อว่าเคล็ดลับนี้มีความพิเศษสำหรับคอมไพเลอร์ของ Microsoft และฉันไม่คิดว่ามันเป็นการพัฒนาดั้งเดิม
คอมไพเลอร์สำหรับไมโครซอฟท์ตั้งค่าที่ควบคุมการใช้งานของหัว precompiled /Yu "stdafx.h"
จะถูกควบคุมโดยอาร์กิวเมนต์บรรทัดคำสั่งคอมไพเลอร์: อย่างที่คุณสามารถจินตนาการได้การใช้stdafx.h
ชื่อไฟล์เป็นแบบแผน คุณสามารถเปลี่ยนชื่อได้หากต้องการ
ใน Visual Studio 2010 การตั้งค่านี้ถูกควบคุมจาก GUI ผ่านการคลิกขวาที่โครงการ CPP เลือก 'คุณสมบัติ' และไปที่ "การกำหนดค่าคุณสมบัติ \ C / C ++ \ Precompiled ส่วนหัว" สำหรับ Visual Studio รุ่นอื่น ๆ ตำแหน่งใน GUI จะแตกต่างกัน
โปรดทราบว่าหากคุณปิดใช้งานส่วนหัว precompiled (หรือเรียกใช้โครงการของคุณผ่านเครื่องมือที่ไม่สนับสนุนพวกเขา) มันจะไม่ทำให้โปรแกรมของคุณผิดกฎหมาย มันก็หมายความว่าเครื่องมือของคุณจะรวบรวมทุกอย่างตั้งแต่เริ่มต้นทุกครั้ง
หากคุณกำลังสร้างไลบรารีที่ไม่มีการขึ้นต่อกันของ Windows คุณสามารถคอมเม้นท์หรือลบ#include
s ออกจากstdafx.h
ไฟล์ได้อย่างง่ายดาย ไม่จำเป็นต้องลบไฟล์ต่อไฟล์ แต่อย่างชัดเจนคุณสามารถทำได้เช่นกันโดยปิดการใช้งานการตั้งค่าส่วนหัวของคอมไพล์ข้างต้น
#include "stdafx.h"
อะไร แน่นอน แต่นั่นเป็นเพียง #include มาตรฐาน ส่วน "MS extension" เป็นเพียงการเพิ่มประสิทธิภาพของคอมไพเลอร์ ไม่เปลี่ยนความหมายของการมีไฟล์ส่วนหัวที่เรียกว่า "stdafx.h" โปรดทราบว่าหากคุณลบการรวมและรหัสของคุณขึ้นอยู่กับสิ่งใดก็ตามที่รวมอยู่ใน stdafx.h คุณจะต้องรวมมันโดยตรง
#include
อยู่ในไฟล์ต้นฉบับ (ทำโดยขั้นตอน 'ตัวประมวลผลก่อน' เดียวกันที่ประเมินแมโคร) ไฟล์ทั้งหมดที่เกิดขึ้นจะถูกส่งผ่านไปยังคอมไพเลอร์จริงซึ่งไม่เคยเห็นไฟล์ส่วนหัวเป็นเอนทิตีแยกต่างหาก คุณใส่การประกาศในไฟล์ส่วนหัวเท่านั้นเพราะนั่นเป็นสิ่งที่ทำงานได้ดีในไฟล์ส่วนหัว - เป็นกฎทั่วไป ลองมัน! สร้างไฟล์ส่วนหัวด้วยโปรแกรมทั้งหมดจากนั้นสร้างไฟล์ต้นฉบับที่มี #include มันรวบรวมดี
มันเป็น "ไฟล์ส่วนหัวที่คอมไพล์แล้ว" - ส่วนหัวใด ๆ ที่คุณรวมไว้ใน stdafx.h จะถูกประมวลผลล่วงหน้าเพื่อประหยัดเวลาในระหว่างการคอมไพล์ครั้งต่อไป คุณสามารถอ่านเพิ่มเติมได้ที่นี่ใน MSDN
หากคุณกำลังสร้างแอปพลิเคชันข้ามแพลตฟอร์มให้ทำเครื่องหมาย "ล้างโครงการ" เมื่อสร้างโครงการของคุณและ Visual Studio จะไม่ใส่ไฟล์ใด ๆ ลงในโครงการของคุณ
"Stdafx.h" เป็นส่วนหัวที่คอมไพล์แล้วรวมไฟล์สำหรับระบบมาตรฐานรวมไฟล์และไฟล์รวมเฉพาะโครงการที่ใช้บ่อย แต่มีการเปลี่ยนแปลงนาน ๆ ครั้งซึ่งจะช่วยลดเวลาในการรวบรวมและการประมวลผลที่ไม่จำเป็น
Precompiled Header stdafx.h ใช้โดยทั่วไปใน Microsoft Visual Studio เพื่อให้คอมไพเลอร์ทราบไฟล์ที่รวบรวมครั้งเดียวและไม่จำเป็นต้องรวบรวมจากศูนย์ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้
http://www.cplusplus.com/articles/1TUq5Di1/
https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017
ฉันเพิ่งพบเจอปัญหานี้ด้วยตัวเองเพราะฉันพยายามสร้างกรอบกระดูกเปลือยเปล่า แต่เริ่มต้นด้วยการสร้างตัวเลือก Win32 Program ใหม่ใน Visual Studio 2017 "stdafx.h" ไม่จำเป็นและควรลบออก จากนั้นคุณสามารถลบโง่ "stdafx.h" และ "stdafx.cpp" ที่อยู่ใน Solution Explorer ของคุณเช่นเดียวกับไฟล์จากโครงการของคุณ ในสถานที่ที่คุณจะต้องใส่
#include <Windows.h>
แทน.