C ++ मॉड्यूल ड्राफ्ट (C ++ 17 के बाद तकनीकी विनिर्देश)
CG / C ++ मॉड्यूल विनिर्देश के लिए एक मसौदा और कई अपडेट किए गए संशोधन WG21 द्वारा खुले-std.org पर प्रकाशित किए गए हैं । मैं यहां केवल नवीनतम दस्तावेजों से लिंक करूंगा:
- कार्य ड्राफ्ट, मॉड्यूल N4610 के लिए C ++ के लिए एक्सटेंशन (अक्टूबर 2016)।
- चौथा संशोधन P0142R0 के रूप में प्रकाशित हुआ (मार्च 2016) के ।
- P0143R2 के रूप में प्रकाशित मॉड्यूल के लिए रिकॉर्डिंग (मार्च 2016) के ।
- क्लैंग टीम ने अपने परिवर्तनों का एक दूसरा संशोधन प्रकाशित किया है: P0273R1 (अक्टूबर 2016)।
निम्नलिखित ब्लॉग पोस्ट में मानकों की बैठकों का सारांश और विशेष रूप से मॉड्यूल ड्राफ्ट की वर्तमान स्थिति का सारांश है:
अपडेट करें: जैसा कि कोना ट्रिप रिपोर्ट में बताया गया है कि मैं ऊपर से जुड़ा था, वर्तमान में दो प्रतिस्पर्धात्मक प्रस्ताव हैं, एक Microsoft से और दूसरा क्लैंग से। Microsoft से प्रस्तावित समाधान मैक्रोज़ को निर्यात करने की अनुमति नहीं देता है, जबकि क्लैंग टीम से समाधान मैक्रोज़ के निर्यात का समर्थन करेगा। अब तक केवल 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
इसका महत्वपूर्ण ध्यान दें कि वर्तमान प्रीप्रोसेसर प्रणाली और मॉड्यूल दोनों सह-अस्तित्व में सक्षम होंगे और हेडर अभी भी उदाहरण के लिए मैक्रोज़ को शामिल करने के लिए उपयोग किया जा सकता है।
अधिक विस्तृत जानकारी के लिए मैं मसौदा पढ़ने का सुझाव देता हूं।
क्लेंग मॉड्यूल
क्लैंग एक मॉड्यूल कार्यान्वयन पर काम कर रहा है जो कि क्लैंग मॉड्यूल पेज पर पाया जा सकता है । हालांकि क्लैंग वर्तमान में मॉड्यूल के लिए एक ठोस सिंटैक्स को लागू नहीं करता है, अर्थात, क्लैंग द्वारा उपर्युक्त सिंटैक्स में से कोई भी लागू नहीं किया गया है। यह समझाने के लिए कि पृष्ठ में निम्नलिखित कथन है:
वर्तमान में, आयात घोषणाओं के लिए कोई C या C ++ सिंटैक्स नहीं है। Clang C ++ समिति में मॉड्यूल प्रस्ताव को ट्रैक करेगा। मॉड्यूल को आयात करने के तरीके के रूप में देखें कि आज आयात कैसे शामिल है।
वर्तमान में क्लैंग द्वारा लागू किया गया मुख्य भाग "मॉड्यूल मैप लैंग्वेज" है जो मौजूदा कोड के लिए मॉड्यूल मैप लिखने की अनुमति देता है जो अभी भी हेडर फ़ाइलों का उपयोग करता है।
मॉड्यूल से मैक्रो एक्सपोर्ट
जैसा कि ऊपर बताया गया है कि अभी भी यह स्पष्ट नहीं है कि मैक्रो निर्यात अंतिम मॉड्यूल टीएस का हिस्सा होगा या नहीं । में P0273R1 निम्न सिंटैक्स मैक्रो के निर्यात के लिए प्रस्तावित किया गया था:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);