Draf Modul C ++ (Spesifikasi Teknis setelah C ++ 17)
Draf dan beberapa revisi terbaru untuk spesifikasi modul C / C ++ telah diterbitkan oleh WG21 di open-std.org. Saya hanya akan menautkan ke dokumen terbaru di sini:
- Draf Kerja, Ekstensi ke C ++ untuk Modul N4610 (Oktober 2016).
- Revisi keempat diterbitkan sebagai P0142R0 (Maret 2016).
- Wording for Modules diterbitkan sebagai P0143R2 (Maret 2016).
- Tim clang telah menerbitkan revisi kedua dari perubahan mereka: P0273R1 (Oktober 2016).
Posting blog berikut berisi ringkasan pertemuan standar dan khususnya ringkasan dari status draf modul saat ini:
Pembaruan: Sebagaimana dijelaskan dalam laporan perjalanan Kona yang saya tautkan di atas, saat ini ada dua proposal yang bersaing, satu dari Microsoft dan satu dari Clang. Solusi yang diusulkan dari Microsoft tidak memungkinkan untuk mengekspor Makro, sedangkan solusi dari tim Clang akan mendukung ekspor Makro. Sejauh ini hanya Microsoft yang secara resmi mengajukan draf spesifikasi modul.
Spesifikasi modul seperti yang diusulkan oleh Microsoft
Berikut adalah ikhtisar singkat tentang konsep terpenting yang terkandung dalam proposal ini. Sebagai draf ini mungkin masih berubah. Standar modul yang baru antara lain terdiri dari:
Kata module
kunci untuk mendeklarasikan modul, beberapa file dapat mendeklarasikan ini untuk membangun satu modul (tetapi untuk setiap modul hanya satu unit kompilasi yang dapat berisi satu export {}
bagian):
module M;
Kata import
kunci untuk mengimpor modul, sebagai gantinya import
mungkin juga akan diputuskan untuk digunakan using module
, sehingga kata kunci impor baru dapat dihindari.
import std.io;
import module.submodule;
Sebuah export
sintaks, yang mendefinisikan deklarasi publik yang merupakan bagian dari modul ini, deklarasi non-antarmuka yang tidak boleh diekspor sebagai bagian dari modul akan ditentukan di luar blok ekspor. Deklarasi dapat berupa segala jenis deklarasi di C / C ++, yaitu tidak hanya fungsi tetapi juga variabel, struct, template, namespace, dan kelas:
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
Perubahan penting dari modul adalah definisi makro dan preprocessor akan menjadi lokal untuk modul dan tidak akan diekspor. Oleh karena itu, makro tidak berdampak apa pun pada modul yang diimpor:
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
Catatan penting bahwa sistem dan modul preprocessor saat ini akan dapat hidup berdampingan dan header masih dapat digunakan misalnya untuk menyertakan makro.
Untuk informasi lebih detail saya sarankan untuk membaca drafnya.
Modul Dentang
Clang telah mengerjakan implementasi modul yang dapat ditemukan di halaman modul clang . Namun clang saat ini tidak mengimplementasikan sintaks konkret untuk modul, yaitu, tidak ada sintaks yang disebutkan di atas yang telah diimplementasikan oleh Clang. Untuk menjelaskannya, halaman tersebut berisi pernyataan berikut:
Saat ini, tidak ada sintaks C atau C ++ untuk deklarasi impor. Clang akan melacak proposal modul di komite C ++. Lihat bagian Termasuk sebagai impor untuk melihat bagaimana modul diimpor hari ini.
Bagian utama yang saat ini diimplementasikan oleh Clang adalah "Module Map Language" yang memungkinkan penulisan peta modul untuk kode yang ada yang masih menggunakan file header.
Ekspor Makro dari Modul
Seperti disebutkan di atas, masih belum jelas apakah ekspor makro akan menjadi bagian dari Modul TS final . Di P0273R1 , sintaks berikut ini diusulkan untuk ekspor makro:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);
Clang adalah kompiler pertama yang mulai mengerjakan modul bahkan sebelum standardisasi selesai. Belum banyak dokumentasi, tetapi kode contoh dapat ditemukan di sini:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/
Beberapa komentar dari Douglas Gregor (pengembang yang mengimplementasikannya):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html
Secara teori, Anda dapat menentukan sekumpulan makro pembantu seperti begin_module, end_module, import_module untuk melindungi diri Anda dari kemungkinan perubahan sintaks yang akan datang di masa mendatang.
EDIT 1:
Douglas Gregor telah merilis presentasi tentang implementasinya:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit
EDIT 2:
Dukungan modul dalam clang telah didokumentasikan di sini:
http://clang.llvm.org/docs/Modules.html
EDIT 3:
Modul sekarang juga didukung di kompiler C ++ Microsoft: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1. aspx
sumber
sumber