2015-10-23 8 views
26

मॉड्यूल # शामिल हैं। Clang has a complete implementation for C++। अगर मैं क्लैंग का उपयोग कर मॉड्यूल का उपयोग करना चाहता हूं तो मैं कैसे जाउंगा?मैं क्लैंग में सी ++ मॉड्यूल का उपयोग कैसे करूं?


import std.io; 
एक सी ++ स्रोत फ़ाइल में

का उपयोग करना काम नहीं करता है (संकलन) अभी तक, मॉड्यूल के लिए विनिर्देश के रूप में (जो वाक्य रचना भी शामिल है) अंतिम नहीं है।


Clang documentation कहा गया है कि, जब -fmodules झंडा गुजर, #includes उनके उचित आयात करने के लिए फिर से लिखा कर दिया जाएगा। -fmodules के साथ इस परीक्षण फ़ाइल कोई भी निशानी बनाम संकलन सब पर एक ही वस्तु फ़ाइल का उत्पादन

$ clang++-3.5 -fmodules -E test.cpp -o test 
$ grep " printf " test 
extern int printf (const char *__restrict __format, ...); 

इसके अलावा, हालांकि, पूर्वप्रक्रमक जाँच अन्यथा पता चलता है (test.cpp केवल #include <stdio.h> और एक खाली मुख्य शामिल हैं)।

मैं क्या गलत कर रहा हूं?

उत्तर

11

की तरह आप का उल्लेख किया, बजना अभी तक एक सी ++ के आयात के लिए वाक्य रचना नहीं है, तो मुझे शक है कि #include निर्देशों जब किसी फ़ाइल preprocessing सचमुच आयात के रूप में लिखा होने जा रहे हैं, ताकि सबसे अच्छा तरीका नहीं हो सकता है परीक्षण करें कि मॉड्यूल इरादे के रूप में काम कर रहे हैं।

हालांकि, अगर आप -fmodules-cache-path=<path> स्पष्ट रूप से सेट करते हैं, तो आप किसी भी मॉड्यूल में शामिल होने पर प्रीकंपिल्ड मॉड्यूल फ़ाइलों (* .pcm) के साथ इसे पॉपुलटिंग कर सकते हैं - यदि कोई मॉड्यूल शामिल है।

यदि आप अभी मॉड्यूल सक्षम मानक लाइब्रेरी का उपयोग करना चाहते हैं तो आपको libC++ (जो मॉड्यूल.मोडालेमैप के साथ संस्करण 3.7.0 के रूप में आ रहा है) का उपयोग करने की आवश्यकता होगी - हालांकि मेरे अनुभव में यह काम नहीं कर रहा है पूरी तरह से अभी तक। (विजुअल स्टूडियो 2015 का सी ++ कंपाइलर भी नवंबर में अपडेट 1 के साथ मॉड्यूल समर्थन का कुछ रूप प्राप्त करना चाहता है)

स्वतंत्र रूप से stdlib के, आप अभी भी अपने कोड में मॉड्यूल का उपयोग कर सकते हैं। क्लैंग डॉक्स में Module Map Language का विस्तृत विवरण होता है, लेकिन मैंने थोड़ा उदाहरण प्रोजेक्ट here (सेमेक का उपयोग करके) भी स्थापित किया है जो बनाया गया है जब कुछ मॉड्यूल के साथ cache निर्देशिका उत्पन्न करना चाहिए।

14

this commit के रूप में, क्लैंग के पास Modules TS के लिए प्रयोगात्मक समर्थन है।

प्रयोगात्मक मॉड्यूल समर्थन के बारे में VS blog post में एक ही उदाहरण फाइलें (एक छोटे से बदलाव के साथ) लेते हैं।

सबसे पहले, मॉड्यूल इंटरफ़ेस फ़ाइल को परिभाषित करें। डिफ़ॉल्ट रूप से, क्लैंग cppm एक्सटेंशन (और कुछ अन्य) के साथ C++ मॉड्यूल इंटरफ़ेस फ़ाइलों के रूप में फ़ाइलों को पहचानता है।

// file: foo.cppm 
export module M; 

export int f(int x) 
{ 
    return 2 + x; 
} 
export double g(double y, int z) 
{ 
    return y * z; 
} 

ध्यान दें कि मॉड्यूल इंटरफ़ेस घोषणा export module M; और न सिर्फ module M; वी.एस. ब्लॉग पोस्ट में की तरह की जरूरत है।इस प्रकार

फिर मॉड्यूल की खपत:

// file: bar.cpp 
import M; 

int main() 
{ 
    f(5); 
    g(0.0, 1); 
    return 0; 
} 

अब,

clang++ -fmodules-ts --precompile foo.cppm -o M.pcm 

साथ मॉड्यूल foo.cppm precompile या, यदि मॉड्यूल इंटरफ़ेस विस्तार अन्य cppm (से मान लीजिए कि ixx करते हैं, यह के रूप में है वीएस के साथ है), आप इसका उपयोग कर सकते हैं:

clang++ -fmodules-ts --precompile -x c++-module foo.ixx -o M.pcm 

फिर

clang++ -fmodules-ts -fprebuilt-module-path=. bar.cpp 

साथ कार्यक्रम बनाने या, यदि पीसीएम फ़ाइल नाम मॉड्यूल का नाम के रूप में ही नहीं है, आप का उपयोग करना चाहते हैं:

clang++ -fmodules-ts -fmodule-file=M.pcm bar.cpp 

मैं पर इन आदेशों परीक्षण किया है विंडोज r303050 build (15 मई 2017) का उपयोग कर।

नोट:

बजना ++ exe:। चेतावनी: तर्क संकलन के दौरान अप्रयुक्त: '-fprebuilt मॉड्यूल-पथ =।' -fprebuilt-module-path=. विकल्प का उपयोग करते हैं, तो मैं यह चेतावनी मिलती [-Wunused-command-line-argument]

जो गलत लगता है क्योंकि उस विकल्प के बिना, मॉड्यूल M नहीं मिला है।

+2

यह एक्सकोड 9 के साथ भी काम करता है। –

संबंधित मुद्दे