File bernama stdafx.h
secara 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?
Jawaban:
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, penggunaanstdafx.h
nama 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
#include
s daristdafx.h
file. Tidak perlu menghapus file itu sendiri, tetapi jelas Anda dapat melakukannya juga, dengan menonaktifkan pengaturan header precompile di atas.sumber
#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.#include
mereka 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.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.
sumber
"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
sumber
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
sebagai gantinya.
sumber