แบบร่างโมดูล C ++ (ข้อกำหนดทางเทคนิคหลัง C ++ 17)
WG21ฉบับร่างและการแก้ไขที่อัปเดตหลายรายการสำหรับข้อกำหนดของโมดูล C / C ++ ได้รับการเผยแพร่โดยWG21บน open-std.org ฉันจะเชื่อมโยงไปยังเอกสารล่าสุดที่นี่เท่านั้น:
- Working Draft, Extensions to C ++ for Modules N4610 (October 2016)
- การแก้ไขครั้งที่สี่เผยแพร่เป็นP0142R0 (มีนาคม 2559)
- คำพูดสำหรับโมดูลที่เผยแพร่เป็นP0143R2 (มีนาคม 2559)
- ทีมเสียงดังได้เผยแพร่การแก้ไขครั้งที่สองของการเปลี่ยนแปลง: P0273R1 (ตุลาคม 2016)
บล็อกโพสต์ต่อไปนี้ประกอบด้วยสรุปการประชุมมาตรฐานและโดยเฉพาะอย่างยิ่งสรุปสถานะปัจจุบันของแบบร่างโมดูล
อัปเดต:ตามที่อธิบายไว้ในรายงานการเดินทางของ Kona ที่ฉันเชื่อมโยงไปข้างต้นขณะนี้มีข้อเสนอที่แข่งขันกันสองข้อข้อเสนอจาก Microsoft และอีกข้อจาก Clang โซลูชันที่เสนอจาก Microsoft ไม่อนุญาตให้ส่งออกมาโครในขณะที่โซลูชันจากทีม Clang จะรองรับการส่งออกมาโคร จนถึงขณะนี้มีเพียง Microsoft เท่านั้นที่ส่งแบบร่างสำหรับข้อกำหนดของโมดูลอย่างเป็นทางการ
ข้อกำหนดของโมดูลตามที่ Microsoft เสนอ
นี่คือภาพรวมโดยย่อของแนวคิดที่สำคัญที่สุดในข้อเสนอนี้ เนื่องจากเป็นแบบร่างสิ่งนี้อาจยังคงมีการเปลี่ยนแปลง มาตรฐานโมดูลใหม่จะประกอบด้วยสิ่งต่อไปนี้:
module
คำหลักที่จะประกาศโมดูลหลายไฟล์สามารถประกาศนี้เพื่อสร้างโมดูลหนึ่ง ( แต่สำหรับแต่ละโมดูลเพียงหนึ่งรวบรวมหน่วยสามารถประกอบด้วยexport {}
ส่วน):
module M;
import
คำหลักเพื่อโมดูลนำเข้าแทนimport
มันก็อาจจะมีการตัดสินใจที่จะใช้using module
แทนดังนั้นคำหลักที่นำเข้าใหม่อาจจะหลีกเลี่ยง
import std.io;
import module.submodule;
export
ไวยากรณ์ซึ่งได้กำหนดให้ประชาชนประกาศว่าเป็นส่วนหนึ่งของโมดูลนี้ไม่ใช่อินเตอร์เฟซที่ประกาศว่าไม่ควรที่จะส่งออกเป็นส่วนหนึ่งของโมดูลจะถูกกำหนดนอกบล็อกการส่งออก การประกาศอาจเป็นการประกาศประเภทใดก็ได้ใน C / C ++ นั่นคือไม่เพียง แต่ฟังก์ชันเท่านั้น แต่ยังรวมถึงตัวแปรโครงสร้างเทมเพลตเนมสเปซและคลาส:
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
การเปลี่ยนแปลงที่สำคัญของโมดูลคือมาโครและคำจำกัดความของตัวประมวลผลล่วงหน้าจะเป็นแบบโลคัลของโมดูลและจะไม่ถูกส่งออก ดังนั้นมาโครจึงไม่มีผลกระทบใด ๆ กับโมดูลที่นำเข้า:
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
โปรดทราบว่าทั้งระบบพรีโพรเซสเซอร์และโมดูลปัจจุบันจะสามารถอยู่ร่วมกันได้และยังสามารถใช้ส่วนหัวเพื่อรวมมาโครได้
สำหรับข้อมูลรายละเอียดเพิ่มเติมฉันขอแนะนำให้อ่านฉบับร่าง
โมดูลเสียงดัง
เสียงดังกราวได้รับการทำงานในการดำเนินงานโมดูลซึ่งสามารถพบได้ที่หน้าโมดูลเสียงดังกราว อย่างไรก็ตาม Clang ไม่ได้ใช้ไวยากรณ์ที่เป็นรูปธรรมสำหรับโมดูลในขณะนี้นั่นคือไม่มีการใช้ไวยากรณ์ที่กล่าวถึงข้างต้นโดย Clang เพื่ออธิบายหน้านี้มีคำสั่งต่อไปนี้:
ในปัจจุบันไม่มีไวยากรณ์ C หรือ C ++ สำหรับการประกาศการนำเข้า Clang จะติดตามข้อเสนอโมดูลในคณะกรรมการ C ++ ดูส่วนรวมเป็นการนำเข้าเพื่อดูวิธีการนำเข้าโมดูลในปัจจุบัน
ส่วนหลักที่ Clang นำมาใช้ในปัจจุบันคือ "Module Map Language" ซึ่งอนุญาตให้เขียนแผนที่โมดูลสำหรับโค้ดที่มีอยู่ซึ่งยังคงใช้ไฟล์ส่วนหัว
การส่งออกมาโครจากโมดูล
ดังที่กล่าวไว้ข้างต้นยังไม่ชัดเจนว่าการส่งออกมาโครจะเป็นส่วนหนึ่งของModulesสุดท้ายหรือไม่ ในP0273R1มีการเสนอไวยากรณ์ต่อไปนี้สำหรับการส่งออกมาโคร:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);