Bagikan melalui


Membersihkan C/C++ termasuk di Visual Studio

Dimulai dengan Visual Studio 17.8 Preview 1, Visual Studio menyediakan #include fitur pembersihan yang meningkatkan kualitas kode Anda dengan cara berikut:

  • Menawarkan untuk menambahkan file header untuk kode yang hanya mengkompilasi karena file header yang diperlukan disertakan secara tidak langsung oleh file header lain.
  • Menawarkan untuk menghapus file header yang tidak digunakan--meningkatkan waktu build dan kebersihan kode.

Pembersihan Sertakan aktif secara default. Untuk mempelajari cara mengonfigurasinya, lihat Konfigurasi C/C++ Sertakan Pembersihan di Visual Studio.

Header langsung vs tidak langsung

Pertama beberapa terminologi:

  • Header langsung adalah header yang Anda secara #include eksplisit dalam kode Anda.
  • Header tidak langsung adalah header yang tidak Anda eksplisit #include. Sebagai gantinya, file header yang Anda lakukan secara langsung menyertakannya, menyertakannya. Kami juga mengatakan bahwa header tidak langsung disertakan transitively.

Sertakan Pembersihan menganalisis kode Anda dan menentukan header mana yang tidak digunakan dan mana yang secara tidak langsung disertakan. Pertimbangkan file header berikut:

// myHeader.h

#include <string>
#include <iostream>

void myFunc()
{
    std::string s = "myFunc()\n";
    std::cout << s;
}

Dan program yang menggunakannya:

// myProgram.cpp
#include "myHeader.h"

int main()
{
    std::string s = "main()"; // string is indirectly included by myHeader.h
    std::cout << s; // cout is indirectly included by myHeader.h
    myFunc();
}

myHeader.h adalah header langsung karena myProgram.cpp secara eksplisit menyertakannya. myHeader.h termasuk <string> dan <iostream>, sehingga itu adalah header tidak langsung.

Masalahnya adalah yang myProgram.cpp menggunakan std::string dan std::cout, tetapi tidak secara langsung menyertakan header yang menentukannya. Kode ini terjadi untuk mengkompilasi karena myHeader.h menyertakan header tersebut. Kode ini rapuh karena jika myHeader.h pernah berhenti termasuk salah satu, myProgram.cpp tidak akan mengkompilasi lagi.

Sesuai panduan C++, lebih baik secara eksplisit menyertakan header untuk semua dependensi Anda sehingga kode Anda tidak tunduk pada kerapahan yang disebabkan oleh perubahan pada file header. Untuk informasi selengkapnya, lihat SF.10: Hindari dependensi pada nama d implisit #include dalam Panduan Inti C++.

Sertakan Pembersihan menganalisis kode Anda untuk mengidentifikasi header yang tidak digunakan dan tidak langsung disertakan. Ini memberikan umpan balik berdasarkan pengaturan yang dijelaskan dalam Mengonfigurasi alat #include C++ di Visual Studio. Umpan balik dapat berupa peringatan daftar kesalahan, saran, dll. Untuk detail selengkapnya tentang umpan balik yang disediakan oleh Sertakan Pembersihan, lihat Menyertakan pesan Pembersihan.

Header yang tidak digunakan

Seiring berkembangnya kode, Anda mungkin tidak lagi memerlukan beberapa file header. Ini sulit dilacak dalam proyek yang kompleks. Seiring waktu, build Anda mungkin memakan waktu lebih lama karena pengkompilasi memproses file header yang tidak perlu. Sertakan Pembersihan membantu Anda menemukan dan menghapus header yang tidak digunakan. Misalnya, bagaimana jika myFunc() dikomentari di myProgram.cpp:

// myProgram.cpp
#include "myHeader.h"

int main()
{
    std::string s = "main()"; // string is indirectly included from myHeader.h
    std::cout << s; // cout is indirectly included from myHeader.h
    // myFunc(); // directly included from myHeader.h
}

Dalam cuplikan layar berikut, #include "myHeader.h" diredupkan (pengaturan yang dijelaskan dalam Mengonfigurasi alat #include C++ di Visual Studio) karena tidak digunakan karena myFunc() dikomentari.

Arahkan kursor Anda ke atas redup untuk memunculkan #include menu tindakan cepat. Klik bola lampu (atau pilih tautan Tampilkan potensi perbaikan ) untuk melihat tindakan yang terkait dengan file yang tidak digunakan:

Tiga opsi refaktor ditampilkan: Hapus # sertakan myHeader.h, hapus semua termasuk yang tidak digunakan, dan Tambahkan semua yang digunakan secara transitif dan hapus semua # yang tidak digunakan termasuk.

Menambahkan header yang digunakan secara transitif

Kita dapat memilih untuk menghapus file header yang tidak digunakan, tetapi itu merusak kode karena <string> dan <iostream> secara tidak langsung disertakan melalui myheader.h.

Sebagai gantinya, kita dapat memilih Tambahkan semua yang digunakan secara transitif dan menghapus semua #includes yang tidak digunakan. Ini menghapus header myHeader.hyang tidak digunakan , tetapi juga menambahkan header apa pun yang digunakan yang secara tidak langsung disertakan melalui myHeader.h. Hasilnya, dalam hal ini, adalah menambahkan #include <string> dan #include <iostream> ke myProgram.cpp, dan menghapus #include "myHeader.h":

// myProgram.cpp
#include <iostream>
#include <string>

int main()
{
    std::string s = "main()"; // string is directly included from <string>
    std::cout << s; // cout is directly included from <string>
    // MyFunc();
}

Alat ini tidak memperbarui komentar, tetapi Anda dapat melihat bahwa kode sekarang menggunakan std::string dan std::cout secara langsung. Kode ini tidak lagi rapuh karena tidak bergantung pada myHeader.h untuk menyertakan header lain yang diperlukan.

Praktik terbaik

Jangan hapus file header yang tampaknya tidak digunakan tanpa terlebih dahulu menambahkan file header yang disertakan secara tidak langsung. Itu karena kode Anda mungkin mengandalkan tidak langsung termasuk dalam file header yang tidak digunakan. Tambahkan header yang digunakan secara transitif terlebih dahulu. Kemudian, saat menghapus header yang tidak digunakan, Anda tidak mendapatkan kesalahan kompilasi karena file header yang hilang yang disertakan secara tidak langsung oleh file header yang telah Anda hapus.

Salah satu cara untuk melakukan ini adalah dengan mengatur pengaturan Sertakan Pembersihan untuk Tambahkan hilang termasuk tingkat saran ke Saran (> Kode). Atur Juga Hapus yang tidak digunakan termasuk tingkat saran ke Saran. lalu:

  1. Dalam daftar kesalahan, pastikan filter diatur ke Build + IntelliSense.
  2. Cari instans "Konten dari #include x digunakan dalam file ini dan disertakan secara transitif."
  3. Arahkan kursor Anda ke atas baris dengan saran. Dari menu dropdown bola lampu, pilih Tambahkan semua yang digunakan secara transitif termasuk.
  4. Ulangi langkah-langkah ini dalam proyek Anda hingga semua saran mengenai transitif disertakan ditangani.
  5. Hapus termasuk yang tidak digunakan: dalam daftar kesalahan, cari instans "#include x tidak digunakan dalam file ini."
  6. Arahkan kursor Anda ke header yang tidak digunakan. Dari menu dropdown bola lampu, pilih Hapus semua yang tidak digunakan termasuk.
  7. Ulangi langkah-langkah ini di proyek Anda hingga semua saran Sertakan Pembersihan ditangani.

Dalam gambaran umum singkat ini, Anda telah melihat bagaimana Sertakan Pembersihan dapat membantu Anda menghapus header yang tidak digunakan, dan menambahkan header yang tidak langsung disertakan. Ini membantu Anda menjaga kode Anda tetap bersih, berpotensi membangun lebih cepat, dan mengurangi rapuh kode Anda.

Lihat juga

Mengonfigurasi C/C++ Sertakan Pembersihan di Visual Studio
Sertakan pesan Pembersihan