Những gì stdafx.h được sử dụng trong Visual Studio là gì?


500

Một tệp có tên stdafx.hđược tạo tự động khi tôi bắt đầu một dự án trong Visual Studio 2010. Tôi cần tạo một thư viện C ++ đa nền tảng, vì vậy tôi không / không thể sử dụng tệp tiêu đề này.

Những gì được stdafx.hsử dụng cho? Tôi có thể xóa tệp tiêu đề này không?


2
Nếu tôi gặp lỗi biên dịch liên quan đến stdafx.h, tôi thường đặt cài đặt thành không tạo hoặc sử dụng tệp này ..
phoad

6
Bài viết: StdAfx.h cho người mới - viva64.com/vi/b/0265

Bạn có thể sử dụng tệp tiêu đề tốt trên các nền tảng khác, với chúng chỉ là một tệp tiêu đề bình thường. Nó chỉ cung cấp không có lợi ích hiệu suất ở đó.
Andrea

Câu trả lời:


826

Tất cả các trình biên dịch C ++ có một vấn đề nghiêm trọng về hiệu năng để giải quyết. Biên dịch mã C ++ là một quá trình dài, chậm.

Biên dịch các tiêu đề được bao gồm trên đầu các tệp C ++ là một quá trình rất dài, chậm. Biên dịch các cấu trúc tiêu đề khổng lồ tạo thành một phần của API Windows và các thư viện API lớn khác là một quá trình rất , rất dài, chậm. Phải làm lại, hơn và hơn, cho mỗi tệp nguồn Cpp duy nhất là một hồi chuông báo tử.

Đây không phải là duy nhất cho Windows nhưng là một vấn đề cũ mà tất cả các trình biên dịch phải đối mặt với một API lớn như Windows.

Trình biên dịch Microsoft có thể cải thiện vấn đề này bằng một thủ thuật đơn giản gọi là tiêu đề được biên dịch trước . Thủ thuật này khá lắt léo: mặc dù mọi tệp CPP có thể mang lại ý nghĩa khác nhau về mặt pháp lý cho chuỗi tệp tiêu đề được bao gồm trên đầu mỗi tệp Cpp (bởi những thứ như có các macro khác nhau # xác định trước bao gồm, hoặc bằng cách bao gồm các tiêu đề theo thứ tự khác nhau), đó thường không phải là trường hợp. Hầu hết thời gian, chúng tôi có hàng chục hoặc hàng trăm tệp được bao gồm, nhưng tất cả chúng đều có cùng ý nghĩa đối với tất cả các tệp Cpp đang được biên dịch trong ứng dụng của bạn.

Trình biên dịch có thể tiết kiệm thời gian rất lớn nếu nó không phải bắt đầu biên dịch mọi tệp Cpp cộng với hàng tá bao gồm cả nghĩa đen từ đầu mỗi lần.

Thủ thuật bao gồm chỉ định một tệp tiêu đề đặc biệt làm điểm bắt đầu của tất cả các chuỗi biên dịch, tệp được gọi là 'tiêu đề được biên dịch trước', thường là một tệp có tên stdafx.h đơn giản vì lý do lịch sử.

Chỉ cần liệt kê tất cả các tiêu đề lớn của bạn cho các API trong tệp stdafx.h của bạn, theo thứ tự phù hợp và sau đó bắt đầu mỗi tệp CPP của bạn ở trên cùng với một #include "stdafx.h", trước bất kỳ nội dung có ý nghĩa nào (chỉ về điều duy nhất được phép trước đó là bình luận).

Trong các điều kiện đó, thay vì bắt đầu từ đầu , trình biên dịch bắt đầu biên dịch từ các kết quả đã lưu của việc biên dịch mọi thứ trong đó stdafx.h.

Tôi không tin rằng thủ thuật này là duy nhất đối với các trình biên dịch của Microsoft và tôi cũng không nghĩ rằng đó là một sự phát triển ban đầu.

Đối với trình biên dịch Microsoft, cài đặt kiểm soát việc sử dụng các tiêu đề được biên dịch trước được điều khiển bởi một đối số dòng lệnh cho trình biên dịch : /Yu "stdafx.h". Như bạn có thể tưởng tượng, việc sử dụng stdafx.htên tệp chỉ đơn giản là một quy ước; bạn có thể thay đổi tên nếu bạn muốn

Trong Visual Studio 2010, cài đặt này được điều khiển từ GUI thông qua Nhấp chuột phải vào Dự án CPP, chọn 'Thuộc tính' và điều hướng đến "Thuộc tính cấu hình \ C / C ++ \ Tiêu đề được biên dịch trước". Đối với các phiên bản khác của Visual Studio, vị trí trong GUI sẽ khác nhau.

Lưu ý rằng nếu bạn vô hiệu hóa các tiêu đề được biên dịch trước (hoặc chạy dự án của bạn thông qua một công cụ không hỗ trợ chúng), thì nó không làm cho chương trình của bạn trở thành bất hợp pháp; nó đơn giản có nghĩa là công cụ của bạn sẽ biên dịch mọi thứ từ đầu mỗi lần.

Nếu bạn đang tạo một thư viện không có phụ thuộc Windows, bạn có thể dễ dàng nhận xét hoặc xóa #includes khỏi stdafx.htệp. Không cần phải xóa tệp mỗi lần, nhưng rõ ràng bạn cũng có thể làm như vậy, bằng cách vô hiệu hóa cài đặt tiêu đề tiền biên dịch ở trên.


6
Ngay cả khi bạn chỉ sử dụng cho các tệp từ không gian tên std, bạn sẽ nhận được lợi ích về tốc độ
Ghita

11
omg, câu trả lời rất hay. Tôi đang tìm kiếm trình biên dịch c tuân thủ tiêu chuẩn. Hóa ra tôi có thể vô hiệu hóa các phần mở rộng micro $ oft khỏi các thuộc tính dự án, thay đổi trình biên dịch từ "auto" thành "c" và bạn có khá nhiều trình biên dịch và IDE "chuẩn".
EKanadily

4
@Rishi: bởi 'dòng', ý bạn là #include "stdafx.h"gì? Chắc chắn, nhưng đó chỉ là một tiêu chuẩn. Phần "phần mở rộng MS" chỉ là một tối ưu hóa hiệu suất của trình biên dịch; nó không thay đổi ngữ nghĩa của việc có một tệp tiêu đề tình cờ được gọi là "stdafx.h". Lưu ý rằng nếu bạn loại bỏ bao gồm và mã của bạn phụ thuộc vào bất kỳ thứ gì được đưa vào qua stdafx.h, bạn sẽ phải đưa nó trực tiếp vào.
Euro Micelli

4
@ Youda008, không hoàn toàn đúng. Trước khi biên dịch tệp mã, nội dung của các tiêu đề được "dán" đơn giản và theo nghĩa đen tại chỗ bạn đặt #includechúng trong tệp nguồn (được thực hiện bởi cùng một bước 'tiền xử lý' để đánh giá các macro). Tổng tệp kết quả sau đó được chuyển đến trình biên dịch thực tế, không bao giờ thấy tệp tiêu đề là một thực thể riêng biệt. Bạn chỉ đặt khai báo trên tệp tiêu đề vì đó là những gì hoạt động tốt trên tệp tiêu đề - đó là quy tắc thông thường. Thử nó! Tạo một tệp tiêu đề với toàn bộ chương trình, sau đó tạo một tệp nguồn chỉ có #include cho nó. Nó biên dịch tốt.
Euro Micelli

28
Sự tò mò lịch sử. Tên của stdafx.h có từ khoảng năm 1992, khi MFC được gọi là 'Phần mở rộng khung ứng dụng' trước khi phát hành. Visual Studio 2015 vẫn mặc định là tên ..
kert

48

Đó là "tệp tiêu đề được biên dịch trước" - mọi tiêu đề bạn đưa vào stdafx.h đều được xử lý trước để tiết kiệm thời gian trong các lần biên dịch tiếp theo. Bạn có thể đọc thêm về nó ở đây trên MSDN .

Nếu bạn đang xây dựng một ứng dụng đa nền tảng, hãy kiểm tra "Dự án trống" khi tạo dự án của bạn và Visual Studio sẽ không đặt bất kỳ tệp nào trong dự án của bạn.


15
Không có gì trong tệp này sẽ không hoạt động trên các nền tảng khác. Nó có thể làm chậm quá trình biên dịch ở đó, nếu trình biên dịch không hỗ trợ các tiêu đề được biên dịch trước, nhưng nó không nên phá vỡ nó. Nó chỉ là một tệp tiêu đề bao gồm các tệp tiêu đề khác.
nổ

2
@detunized: Có thể câu trả lời của tôi khiến nó nghe có vẻ khác, vì vậy cảm ơn vì đã làm rõ phần đó.
casifer

3

"Stdafx.h" là một tiêu đề được biên dịch trước. Nó bao gồm tệp cho hệ thống tiêu chuẩn bao gồm các tệp và cho các tệp bao gồm dự án được sử dụng thường xuyên nhưng được thay đổi không thường xuyên. Làm giảm thời gian biên dịch và Xử lý không cần thiết.

Tiêu đề được biên dịch sẵn stdafx.h về cơ bản được sử dụng trong Microsoft Visual Studio để cho trình biên dịch biết các tệp đã được biên dịch và không cần phải biên dịch lại từ đầu. Bạn có thể đọc thêm về nó

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017


-10

Tôi chỉ gặp phải vấn đề này vì tôi đang cố gắng tạo cho mình một khung xương trần nhưng bắt đầu bằng cách tạo tùy chọn Chương trình Win32 mới trong Visual Studio 2017. "stdafx.h" là không cần thiết và cần được xóa. Sau đó, bạn có thể xóa "stdafx.h" và "stdafx.cpp" ngu ngốc trong Solution Explorer cũng như các tệp trong dự án của bạn. Ở vị trí của nó, bạn sẽ cần đặt

#include <Windows.h>

thay thế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.