“ stdafx.h” ใช้สำหรับอะไรใน Visual Studio


500

ไฟล์ที่ชื่อstdafx.hจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อฉันเริ่มโครงการใน Visual Studio 2010 ฉันต้องสร้างไลบรารี C ++ ข้ามแพลตฟอร์มดังนั้นฉันจึงไม่ / ไม่สามารถใช้ไฟล์ส่วนหัวนี้ได้

อะไรคือสิ่งที่stdafx.hใช้? ตกลงไหมที่ฉันจะลบไฟล์ส่วนหัวนี้?


2
ถ้าฉันได้รับรวบรวมข้อผิดพลาดที่เกี่ยวข้องกับการ stdafx.h ผมมักตั้งค่าที่จะไม่สร้างหรือใช้ไฟล์นี้ ..
phoad

6
บทความ: StdAfx.h สำหรับสามเณร - viva64.com/th/b/0265

คุณสามารถใช้ไฟล์ส่วนหัวได้ดีบนแพลตฟอร์มอื่น ๆ สำหรับพวกเขาเป็นเพียงไฟล์ส่วนหัวปกติ มันไม่ได้ให้ประโยชน์ด้านประสิทธิภาพเลย
Andrea

คำตอบ:


826

คอมไพเลอร์ 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 คุณสามารถคอมเม้นท์หรือลบ#includes ออกจากstdafx.hไฟล์ได้อย่างง่ายดาย ไม่จำเป็นต้องลบไฟล์ต่อไฟล์ แต่อย่างชัดเจนคุณสามารถทำได้เช่นกันโดยปิดการใช้งานการตั้งค่าส่วนหัวของคอมไพล์ข้างต้น


6
แม้ว่าคุณจะใช้เพียงไฟล์จาก std namespace คุณก็จะได้รับความเร็วที่เพิ่มขึ้น
Ghita

11
ดีมากคำตอบที่ดีมากแน่นอนฉันกำลังมองหาคอมไพเลอร์มาตรฐานที่ได้มาตรฐาน ปรากฎว่าฉันสามารถปิดใช้งานส่วนขยาย micro $ oft จากคุณสมบัติโครงการเปลี่ยนคอมไพเลอร์จาก "auto" เป็น "c" และคุณค่อนข้างมีคอมไพเลอร์ "มาตรฐาน" และ IDE
EKanadily

4
@ ฤishiษี: โดย 'สาย' คุณหมายถึง#include "stdafx.h"อะไร แน่นอน แต่นั่นเป็นเพียง #include มาตรฐาน ส่วน "MS extension" เป็นเพียงการเพิ่มประสิทธิภาพของคอมไพเลอร์ ไม่เปลี่ยนความหมายของการมีไฟล์ส่วนหัวที่เรียกว่า "stdafx.h" โปรดทราบว่าหากคุณลบการรวมและรหัสของคุณขึ้นอยู่กับสิ่งใดก็ตามที่รวมอยู่ใน stdafx.h คุณจะต้องรวมมันโดยตรง
Euro Micelli

4
@ Youda008 ไม่เป็นความจริงเลย ก่อนที่จะรวบรวมไฟล์รหัสเนื้อหาของส่วนหัวนั้นเรียบง่ายและ "วาง" ในจุดที่คุณ#includeอยู่ในไฟล์ต้นฉบับ (ทำโดยขั้นตอน 'ตัวประมวลผลก่อน' เดียวกันที่ประเมินแมโคร) ไฟล์ทั้งหมดที่เกิดขึ้นจะถูกส่งผ่านไปยังคอมไพเลอร์จริงซึ่งไม่เคยเห็นไฟล์ส่วนหัวเป็นเอนทิตีแยกต่างหาก คุณใส่การประกาศในไฟล์ส่วนหัวเท่านั้นเพราะนั่นเป็นสิ่งที่ทำงานได้ดีในไฟล์ส่วนหัว - เป็นกฎทั่วไป ลองมัน! สร้างไฟล์ส่วนหัวด้วยโปรแกรมทั้งหมดจากนั้นสร้างไฟล์ต้นฉบับที่มี #include มันรวบรวมดี
Euro Micelli

28
ความอยากรู้ทางประวัติศาสตร์ ชื่อของ stdafx.h วันที่ประมาณปี 1992 เมื่อ MFC ถูกเรียกว่า 'Application Framework Extensions' ก่อนที่จะวางจำหน่าย Visual Studio 2015 ยังคงเริ่มต้นที่ชื่อ ..
เคิร์ท

48

มันเป็น "ไฟล์ส่วนหัวที่คอมไพล์แล้ว" - ส่วนหัวใด ๆ ที่คุณรวมไว้ใน stdafx.h จะถูกประมวลผลล่วงหน้าเพื่อประหยัดเวลาในระหว่างการคอมไพล์ครั้งต่อไป คุณสามารถอ่านเพิ่มเติมได้ที่นี่ใน MSDN

หากคุณกำลังสร้างแอปพลิเคชันข้ามแพลตฟอร์มให้ทำเครื่องหมาย "ล้างโครงการ" เมื่อสร้างโครงการของคุณและ Visual Studio จะไม่ใส่ไฟล์ใด ๆ ลงในโครงการของคุณ


15
ไม่มีไฟล์ใดในไฟล์นี้ที่จะไม่ทำงานบนแพลตฟอร์มอื่น มันอาจทำให้การคอมไพล์ช้าลงหากคอมไพเลอร์ไม่สนับสนุนส่วนหัวที่คอมไพล์แล้ว แต่ไม่ควรทำให้คอมไพล์เสีย มันเป็นเพียงไฟล์ส่วนหัวที่มีไฟล์ส่วนหัวอื่น ๆ
detunized

2
@dununized: บางทีคำตอบของฉันอาจทำให้มันเป็นอย่างอื่นดังนั้นขอขอบคุณสำหรับการชี้แจงส่วนนั้น
คาซาบลังกา

3

"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


-10

ฉันเพิ่งพบเจอปัญหานี้ด้วยตัวเองเพราะฉันพยายามสร้างกรอบกระดูกเปลือยเปล่า แต่เริ่มต้นด้วยการสร้างตัวเลือก Win32 Program ใหม่ใน Visual Studio 2017 "stdafx.h" ไม่จำเป็นและควรลบออก จากนั้นคุณสามารถลบโง่ "stdafx.h" และ "stdafx.cpp" ที่อยู่ใน Solution Explorer ของคุณเช่นเดียวกับไฟล์จากโครงการของคุณ ในสถานที่ที่คุณจะต้องใส่

#include <Windows.h>

แทน.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.