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:

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 penghapusan file header yang tidak digunakan--mempercepat waktu build dan meningkatkan kerapian kode.

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

Header langsung vs tidak langsung

Beberapa terminologi:

  • Header langsung adalah header yang Anda tentukan secara eksplisit #include di dalam kode Anda.
  • Sebuah berkas header disertakan secara tidak langsung karena berkas header yang Anda sertakan secara langsung juga menyertakannya. Anda juga dapat mengatakan bahwa header tidak langsung disertakan transitively.

Include Cleanup menganalisis kode Anda dan menentukan header mana yang tidak digunakan serta mana yang disertakan secara tidak langsung. 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 myProgram.cpp menggunakan std::string dan std::cout, tetapi tidak secara langsung menyertakan header yang mendefinisikannya. Kode ini dikompilasi 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 tentang pedoman, lihat SF.10: Hindari dependensi pada nama d implisit #include dalam Panduan Inti C++.

Include Cleanup menganalisis kode Anda untuk mengidentifikasi header yang tidak digunakan dan header yang disertakan secara tidak langsung. Ini memberikan umpan balik berdasarkan pengaturan yang dijelaskan dalam Mengonfigurasi alat #include C++ di Visual Studio. Umpan balik tersebut berupa peringatan dan saran dalam daftar kesalahan. Untuk detail lebih lanjut tentang umpan balik yang diberikan oleh Include Cleanup, lihat pesan Include Cleanup.

Header yang tidak digunakan

Seiring berkembangnya kode, Anda mungkin tidak lagi memerlukan beberapa file header. Sulit untuk melacak header ini 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 Anda menjadikan myFunc() sebagai komentar 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" tampak redup (pengaturan yang dijelaskan dalam Mengonfigurasi alat #include C++ di Visual Studio) karena tidak lagi diperlukan karena myFunc() dikomentari.

Arahkan kursor ke elemen yang diredupkan #include untuk menampilkan menu tindakan cepat. Pilih bola lampu (atau pilih tautan Tampilkan potensi perbaikan ) untuk melihat tindakan yang terkait dengan file yang tidak digunakan:

Tiga opsi refaktorisasi ditampilkan: Hapus #include myHeader.h, hapus semua direktif include yang tidak digunakan, dan tambahkan semua yang digunakan secara transitif serta hapus semua direktif #include yang tidak digunakan.

Menambahkan header yang digunakan secara transitif

Anda mungkin memilih untuk menghapus file header yang tidak digunakan, tetapi tindakan tersebut merusak kode karena <string> dan <iostream> secara tidak langsung disertakan oleh 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. Kode Anda mungkin bergantung pada include tidak langsung dalam file header yang sebenarnya tidak digunakan. Tambahkan header yang digunakan secara transitif terlebih dahulu. Dengan begitu, saat Anda menghapus header yang tidak digunakan, Anda tidak akan mengalami kesalahan kompilasi akibat file header yang hilang, yang sebelumnya disertakan secara tidak langsung melalui file header yang Anda hapus.

Salah satu cara untuk melakukan ini adalah:

  • Atur pengaturan Sertakan Pembersihan untuk Tambahkan yang hilang menyertakan tingkat saran ke Saran (Opsi>Alat>Editor> TeksC/C++>Pembersihan Kode).
  • Atur Tingkat saran untuk menghapus include yang tidak digunakan ke Saran.

Salah satu cara untuk melakukan ini adalah:

  • Atur menu tarik-turun untuk pengaturan Include Cleanup bagi Pilih cara menyoroti pernyataan #include yang hilang yang disertakan secara transitif ke Saran (Alat>Opsi>Semua Pengaturan>Bahasa>C/C++>Pembersihan kode>Include cleanup).
  • Atur Pilih cara menyoroti pernyataan #include yang tidak digunakan ke Saran.

lalu:

  1. Dalam daftar kesalahan, pastikan filter diatur ke Build + IntelliSense.
  2. Cari kemunculan "konten dari #include x digunakan di file ini dan disertakan secara transitif."
  3. Arahkan kursor Anda ke baris yang berisi saran. Dari menu dropdown ikon lampu, pilih Tambahkan semua include yang digunakan secara transitif.
  4. Ulangi langkah-langkah ini dalam proyek Anda hingga semua saran terkait include transitif telah 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 tarik-turun ikon lampu, pilih Hapus semua include yang tidak digunakan.
  7. Ulangi langkah-langkah ini dalam proyek Anda hingga semua saran pembersihan include ditindaklanjuti.

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

Lihat juga

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