Dự thảo mô-đun C ++ (Đặc điểm kỹ thuật sau C ++ 17)
Một dự thảo và chỉnh sửa vài lần cập nhật cho C / C ++ mô-đun đặc điểm kỹ thuật đã được công bố bởi WG21 trên open-std.org. Tôi sẽ chỉ liên kết đến các tài liệu mới nhất ở đây:
- Bản thảo làm việc, Phần mở rộng cho C ++ cho Mô-đun N4610 (tháng 10 năm 2016).
- Bản sửa đổi thứ tư được xuất bản là P0142R0 (tháng 3 năm 2016).
- Ghi cho Mô-đun được xuất bản là P0143R2 (tháng 3 năm 2016).
- Nhóm clang đã xuất bản bản sửa đổi thứ hai về những thay đổi của họ: P0273R1 (tháng 10 năm 2016).
Các bài đăng trên blog sau chứa tóm tắt về các cuộc họp tiêu chuẩn và đặc biệt là tóm tắt về tình trạng hiện tại của dự thảo mô-đun:
Cập nhật: Như đã giải thích trong báo cáo chuyến đi Kona mà tôi đã liên kết ở trên, hiện có hai đề xuất cạnh tranh, một từ Microsoft và một từ Clang. Giải pháp được đề xuất từ Microsoft không cho phép xuất Macro, trong khi giải pháp từ nhóm Clang sẽ hỗ trợ xuất Macro. Cho đến nay chỉ có Microsoft chính thức gửi bản thảo cho một đặc tả mô-đun.
Đặc điểm kỹ thuật mô-đun theo đề xuất của Microsoft
Dưới đây là tổng quan nhanh về các khái niệm quan trọng nhất trong đề xuất này. Như một bản nháp, điều này có thể vẫn thay đổi. Tiêu chuẩn mô-đun mới sẽ bao gồm những điều sau đây:
Một module
từ khóa để khai báo một mô-đun, nhiều tệp có thể khai báo điều này để xây dựng một mô-đun (nhưng đối với mỗi mô-đun, chỉ một đơn vị biên dịch có thể chứa một export {}
phần):
module M;
Một import
từ khóa để nhập mô-đun, thay vì import
nó cũng có thể được quyết định sử dụng using module
thay thế, vì vậy có thể tránh sử dụng từ khóa nhập mới.
import std.io;
import module.submodule;
Một export
cú pháp, xác định các khai báo công khai là một phần của mô-đun này, các khai báo không phải giao diện không nên được xuất như một phần của mô-đun sẽ được xác định bên ngoài khối xuất. Tờ khai có thể được bất kỳ loại khai trong C / C ++, có nghĩa là, không chỉ có chức năng mà còn biến, cấu trúc, mẫu, không gian tên và các lớp:
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
Một thay đổi quan trọng của các mô-đun sẽ là các macro và định nghĩa bộ xử lý trước sẽ là cục bộ cho các mô-đun và sẽ không được xuất. Do đó, macro không có bất kỳ tác động nào đến các mô-đun đã nhập:
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
Lưu ý quan trọng của nó là cả hệ thống tiền xử lý hiện tại và các mô-đun sẽ có thể cùng tồn tại và các tiêu đề vẫn có thể được sử dụng chẳng hạn để bao gồm các macro.
Để biết thêm thông tin chi tiết, tôi đề nghị đọc bản nháp.
Mô-đun Clang
Clang đã và đang làm việc trên một triển khai mô-đun có thể được tìm thấy tại trang mô-đun clang . Tuy nhiên, clang hiện không triển khai cú pháp cụ thể cho các mô-đun, tức là không có cú pháp nào trong số các cú pháp nêu trên đã được thực hiện bởi Clang. Để giải thích điều này, trang này chứa câu lệnh sau:
Hiện tại chưa có cú pháp C hoặc C ++ cho các khai báo nhập khẩu. Clang sẽ theo dõi đề xuất mô-đun trong ủy ban C ++. Xem phần Bao gồm dưới dạng nhập để xem cách các mô-đun được nhập ngay hôm nay.
Phần chính hiện được Clang thực hiện là "Ngôn ngữ bản đồ mô-đun" cho phép viết bản đồ mô-đun cho mã hiện có vẫn sử dụng tệp tiêu đề.
Xuất Macro từ Mô-đun
Như đã đề cập ở trên, vẫn chưa rõ liệu xuất khẩu vĩ mô sẽ là một phần của Mô-đun cuối cùng TS . Trong P0273R1 , cú pháp sau được đề xuất để xuất macro:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);