Untuk apa "stdafx.h" digunakan dalam Visual Studio?

500

File bernama stdafx.hsecara otomatis dihasilkan ketika saya memulai proyek di Visual Studio 2010. Saya perlu membuat perpustakaan C ++ lintas-platform, jadi saya tidak / tidak bisa menggunakan file header ini.

Untuk apa stdafx.h? Apakah boleh saya menghapus file header ini?

prosseek
sumber
2
Jika saya mendapatkan kesalahan kompilasi yang terkait dengan stdafx.h, saya biasanya mengatur pengaturan untuk tidak membuat atau menggunakan file ini ..
phoad
6
Artikel: StdAfx.h untuk Pemula
Anda dapat menggunakan file header dengan baik di platform lain, bagi mereka hanya file header normal. Itu hanya menawarkan tidak ada manfaat kinerja di sana.
Andrea

Jawaban:

826

Semua kompiler C ++ memiliki satu masalah kinerja serius yang harus dihadapi. Mengkompilasi kode C ++ adalah proses yang panjang dan lambat.

Mengkompilasi tajuk yang termasuk di atas file C ++ adalah proses yang sangat panjang dan lambat. Mengompilasi struktur header besar yang membentuk bagian dari Windows API dan pustaka API besar lainnya adalah proses yang sangat , sangat lama, lambat. Harus melakukannya berulang-ulang untuk setiap file sumber Cpp adalah lonceng kematian.

Ini tidak unik untuk Windows tetapi masalah lama yang dihadapi oleh semua kompiler yang harus dikompilasi terhadap API besar seperti Windows.

Kompiler Microsoft dapat memperbaiki masalah ini dengan trik sederhana yang disebut header terkompilasi . Triknya cukup apik: meskipun setiap file CPP berpotensi dan secara hukum memberikan arti sligthly yang berbeda pada rantai file header yang disertakan di atas setiap file Cpp (dengan hal-hal seperti memiliki # makro berbeda sebelum menentukan termasuk, atau dengan memasukkan tajuk dalam urutan berbeda), yang paling sering tidak demikian. Sebagian besar waktu, kami memiliki lusinan atau ratusan file yang disertakan, tetapi semuanya dimaksudkan untuk memiliki arti yang sama untuk semua file Cpp yang dikompilasi dalam aplikasi Anda.

Kompiler dapat menghemat banyak waktu jika tidak harus mulai mengkompilasi setiap file Cpp ditambah lusinannya secara harfiah dari awal setiap waktu.

Caranya terdiri dari menunjuk file header khusus sebagai titik awal dari semua rantai kompilasi, yang disebut file 'precompiled header', yang biasanya merupakan file bernama stdafx.h hanya karena alasan historis.

Cukup daftarkan semua tajuk besar Anda untuk API Anda di file stdafx.h Anda, dalam urutan yang sesuai, dan kemudian mulailah setiap file CPP Anda di bagian paling atas dengan #include "stdafx.h", sebelum konten yang bermakna (hanya tentang satu-satunya hal yang diperbolehkan sebelumnya adalah komentar).

Dalam kondisi tersebut, alih-alih memulai dari awal , kompiler mulai mengkompilasi dari hasil kompilasi yang sudah tersimpan sebelumnya stdafx.h.

Saya tidak percaya bahwa trik ini unik untuk kompiler Microsoft, saya juga tidak berpikir itu adalah pengembangan asli.

Untuk Microsoft kompiler, pengaturan bahwa kontrol penggunaan header dikompilasi dikendalikan oleh argumen baris perintah untuk compiler: /Yu "stdafx.h". Seperti yang dapat Anda bayangkan, penggunaan stdafx.hnama file hanyalah sebuah konvensi; Anda dapat mengubah nama jika diinginkan.

Dalam Visual Studio 2010, pengaturan ini dikendalikan dari GUI melalui Mengklik kanan pada Proyek CPP, memilih 'Properti' dan menavigasi ke "Properti Konfigurasi \ C / C ++ \ Precompiled Header". Untuk versi lain dari Visual Studio, lokasi di GUI akan berbeda.

Perhatikan bahwa jika Anda menonaktifkan header yang dikompilasi (atau menjalankan proyek Anda melalui alat yang tidak mendukungnya), itu tidak membuat program Anda ilegal; itu berarti bahwa alat Anda akan mengkompilasi semuanya dari awal setiap kali.

Jika Anda membuat perpustakaan tanpa ketergantungan Windows, Anda dapat dengan mudah berkomentar atau menghapus #includes dari stdafx.hfile. Tidak perlu menghapus file itu sendiri, tetapi jelas Anda dapat melakukannya juga, dengan menonaktifkan pengaturan header precompile di atas.

Euro Micelli
sumber
6
Bahkan jika Anda hanya menggunakan file dari std namespace Anda mendapatkan manfaat kecepatan
Ghita
11
OMG, jawaban yang sangat bagus. Aku sedang mencari compiler standar c compiler. ternyata saya dapat menonaktifkan ekstensi mikro $ sering dari properti proyek, mengubah kompiler dari "otomatis" menjadi "c" dan Anda cukup banyak memiliki "standar" kompiler dan IDE.
EKanadily
4
@Rishi: dengan 'line', maksud Anda #include "stdafx.h"? Tentu, tapi itu hanya #include standar. Bagian "ekstensi MS" hanyalah optimasi kinerja kompiler; itu tidak mengubah semantik memiliki file header yang kebetulan disebut "stdafx.h". Perhatikan bahwa jika Anda menghapus menyertakan dan kode Anda bergantung pada apa pun yang dimasukkan melalui stdafx.h, Anda harus memasukkannya secara langsung.
Euro Micelli
4
@ Youda008, tidak sepenuhnya benar. Sebelum mengkompilasi file kode, isi header secara sederhana dan harfiah "ditempelkan" di tempat Anda #includemereka dalam file sumber (dilakukan oleh langkah 'preprocessor' yang sama yang mengevaluasi makro). Total file yang dihasilkan kemudian diteruskan ke kompiler yang sebenarnya, yang tidak pernah melihat file header sebagai entitas yang terpisah. Anda hanya meletakkan deklarasi pada file header karena itulah yang bekerja dengan baik pada file header - ini adalah aturan konvensional. Cobalah! Buat file header dengan seluruh program, lalu buat file sumber yang hanya memiliki #include untuknya. Mengkompilasi dengan baik.
Euro Micelli
28
Keingintahuan sejarah. Nama stdafx.h berasal dari sekitar tahun 1992, ketika MFC disebut 'Application Framework Extensions' sebelum dirilis. Visual Studio 2015 masih default untuk nama ..
kert
48

Ini adalah "file header yang dikompilasi" - setiap header yang Anda sertakan di stdafx.h sudah diproses sebelumnya untuk menghemat waktu selama kompilasi berikutnya. Anda dapat membaca lebih lanjut tentang ini di MSDN .

Jika Anda membuat aplikasi lintas platform, periksa "Proyek kosong" saat membuat proyek Anda dan Visual Studio tidak akan memasukkan file apa pun di proyek Anda.

casablanca
sumber
15
Tidak ada dalam file ini yang tidak akan berfungsi pada platform lain. Mungkin memperlambat kompilasi di sana, jika kompiler tidak mendukung header yang dikompilasi, tetapi seharusnya tidak merusaknya. Itu hanya file header yang menyertakan file header lainnya.
Diasingkan
2
@detunized: Mungkin jawaban saya membuatnya terdengar sebaliknya, jadi terima kasih telah menjelaskan bagian itu.
casablanca
3

"Stdafx.h" adalah header yang dikompilasi. Ini termasuk file untuk sistem standar termasuk file dan untuk proyek termasuk file yang sering digunakan tetapi sering diubah. Yang mengurangi waktu kompilasi dan Pemrosesan yang Tidak Perlu.

Precompiled Header stdafx.h pada dasarnya digunakan di Microsoft Visual Studio untuk membiarkan kompiler mengetahui file yang pernah dikompilasi dan tidak perlu dikompilasi dari awal. Anda dapat membaca lebih lanjut tentang itu

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

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

Akash das
sumber
-10

Saya sendiri mengalami hal ini karena saya mencoba untuk membuat diri saya kerangka kerja telanjang tetapi mulai dengan membuat opsi Program Win32 baru di Visual Studio 2017. "stdafx.h" tidak perlu dan harus dihapus. Kemudian Anda dapat menghapus "stdafx.h" dan "stdafx.cpp" yang ada di Solution Explorer serta file dari proyek Anda. Di tempatnya, Anda harus meletakkannya

#include <Windows.h>

sebagai gantinya.

Adam H.
sumber