{"id":3840,"date":"2020-05-15T14:58:01","date_gmt":"2020-05-15T12:58:01","guid":{"rendered":"https:\/\/mariusbancila.ro\/blog\/?p=3840"},"modified":"2020-05-15T14:58:01","modified_gmt":"2020-05-15T12:58:01","slug":"modules-in-clang-11","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/","title":{"rendered":"Modules in Clang 11"},"content":{"rendered":"<p>In my <a href=\"https:\/\/mariusbancila.ro\/blog\/2020\/05\/07\/modules-in-vc-2019-16-5\/\">previous post<\/a>, I wrote about the support for C++20 modules in Visual Studio 2019 16.5. VC++ is not the only major compiler that has experimental support for modules. Clang has its own implementation, although only partial. In this post, I will discuss the support available in Clang 11. You can check the current status <a href=\"https:\/\/clang.llvm.org\/cxx_status.html\" rel=\"noopener noreferrer\" target=\"_blank\">here<\/a>.<\/p>\n<p><!-- more --><\/p>\n<p class=\"important-icon-lite\">Disclaimer: My experience with Clang is limited to compiling various snippets of code. Although documentation may exist in some inner circle of trust, it is not easily found using search engines. The content of this article was put together from several bits of information found online and large amounts of trial and error. Therefore, the information I present below may not be complete (although I hope it is correct). If you find anything that needs to be complemented or corrected, please leave a comment and I will update accordingly.<\/p>\n<h2>A first example<\/h2>\n<p>Let&#8217;s start again with the typical hello world application in C++ that looks as follows: <\/p>\n<pre class=\"lang:c++ decode:true \" >#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n    std::cout &lt;&lt; \"Hello, World!\\n\";\r\n}<\/pre>\n<p>To compile this with Clang you need to run the following command:<\/p>\n<pre class=\"lang:c++ decode:true \" >clang++ -Wall -std=c++2a -stdlib=libc++ main.cpp -o main<\/pre>\n<p>Noticed that I specified <tt>-std=c++2a<\/tt> to indicate support for C++20, although any other version would have worked. However, this switch is required to enable modules support, which used to be available only by specifying <tt>-fmodules-ts<\/tt>. This is now no longer necessarily when compiling with <tt>-std=c++2a<\/tt>.<\/p>\n<p>This program can be modified to use modules instead by replacing the <tt>#include<\/tt> preprocessor directive with an <tt>import<\/tt> directive, as follows:<\/p>\n<pre class=\"lang:c++ decode:true \" >import &lt;iostream&gt;;\r\n\r\nint main()\r\n{\r\n    std::cout &lt;&lt; \"Hello, World!\\n\";\r\n}<\/pre>\n<p>Compiling this program requires some changes to the command we executed previously.<\/p>\n<pre class=\"lang:default decode:true \" >clang++ -Wall -std=c++2a -stdlib=libc++ -fimplicit-modules -fimplicit-module-maps main.cpp -o main<\/pre>\n<p>So, what do these additional arguments represent?<\/p>\n<ul>\n<li><tt>-fimplicit-modules<\/tt> tells the compiler to use implicit modules, which is a feature that automatically translates <tt>#include<\/tt> directives into <tt>import<\/tt> statements (i.e. headers into modules).<\/li>\n<li><tt>-fimplicit-module-maps<\/tt> tells the compiler to implicitly search the file system for module map files. A module map file is a file containing the mapping between existing headers and the logical structure of a module. You can learn more about these from <a href=\"https:\/\/clang.llvm.org\/docs\/Modules.html\" rel=\"noopener noreferrer\" target=\"_blank\">here<\/a>.<\/li>\n<\/ul>\n<h2>Writing a module<\/h2>\n<p>The next step is to write a module that exports a function, called <tt>get_greeting_text()<\/tt> in this example, that returns the text that will be printed to the console in the main program. The following snippet shows the content of the module from a file called <strong>greetings.cpp<\/strong>.<\/p>\n<pre class=\"lang:c++ decode:true \" >export module greetings;\r\n \r\nimport &lt;string&gt;;\r\n \r\nexport std::string get_greeting_text()\r\n{\r\n    return \"Hello, World!\";\r\n}<\/pre>\n<p>The changes to the main program are simple: import the <strong>greetings<\/strong> module and call the <tt>get_greeting_text()<\/tt> function.<\/p>\n<pre class=\"lang:c++ decode:true \" >import &lt;iostream&gt;;\r\nimport greetings;\r\n\r\nint main()\r\n{\r\n    std::cout &lt;&lt; get_greeting_text() &lt;&lt; '\\n';\r\n}<\/pre>\n<p>Compiling the module and the main program this time gets a bit more complicated. The following commands must be executed:<\/p>\n<pre class=\"lang:default decode:true \" >clang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -c greetings.cpp -Xclang -emit-module-interface -o greetings.pcm\r\nclang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. main.cpp greetings.cpp -o main<\/pre>\n<p>The first command, compiles the module and generates a file called <strong>greetings.pcm<\/strong>. PCM here stands for &#8220;precompiled module&#8221;. This file is the Binary Module Interface (BMI) file and is the equivalent of the IFC file generated by the VC++ compiler. <a href=\"https:\/\/gcc.gnu.org\/wiki\/cxx-modules\" rel=\"noopener noreferrer\" target=\"_blank\">GCC is using yet another term<\/a>, &#8220;Compiled Module Interfaces&#8221; and the extension CMI. The second command, compiles the main program. You will notice in the arguments, a new switch called <tt>-fprebuilt-module-path<\/tt>. This tells the compiler what is the path of the folder containing the prebuilt modules (the .pcm files).<\/p>\n<p>In this example, the module file had the extension <strong>.cpp<\/strong>. However, Clang supports other extensions, including <strong>.cppm<\/strong> and even <strong>.ixx<\/strong>. However, when using different extensions, the commands for building the module change. <\/p>\n<p>These are the commands to build the same sample if the <strong>greetings<\/strong> module was available in a file called <strong>greetings.cppm<\/strong>.<\/p>\n<pre class=\"lang:default decode:true \" >clang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fmodules --precompile greetings.cppm -o greetings.pcm\r\nclang++ -fmodules -c greetings.pcm -o greetings.o\r\nclang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. greetings.o main.cpp -o main<\/pre>\n<p>These are the commands to build the same sample if the <strong>greetings<\/strong> module was available in a file called <strong>greetings.ixx<\/strong>.<\/p>\n<pre class=\"lang:default decode:true \" >clang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fmodules --precompile -x c++-module greetings.ixx -o greetings.pcm\r\nclang++ -fmodules -c greetings.pcm -o greetings.o\r\nclang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. greetings.o main.cpp -o main<\/pre>\n<p>We can add more exports to the module, just as we did in the previous article. In the following example, the <tt>greeter<\/tt> class returns a random text every time its call operator is invoked.<\/p>\n<pre class=\"lang:c++ decode:true \" >export module greetings;\r\n \r\nimport &lt;string&gt;;\r\n \r\nexport std::string get_greeting_text()\r\n{\r\n    return \"Hello, World!\";\r\n}\r\n\r\nexport struct greeter\r\n{\r\n   constexpr static const char* hellos[] {\"Hello\", \"Hi\", \"Hey\"};\r\n   std::string operator()()\r\n   {\r\n      return hellos[rand() % 3] + std::string{\", World!\"};\r\n   }\r\n};<\/pre>\n<p>This new class can be used as shown below. If you run this program multiple times, you should see the second line changing randomly. <\/p>\n<pre class=\"lang:c++ decode:true \" >import &lt;iostream&gt;;\r\nimport &lt;cstdlib&gt;;\r\nimport greetings;\r\n\r\nint main()\r\n{\r\n    std::cout &lt;&lt; get_greeting_text() &lt;&lt; '\\n';\r\n\r\n    std::srand(std::time(0));\r\n    std::cout &lt;&lt; greeter()() &lt;&lt; '\\n';\r\n}<\/pre>\n<p>The commands required to build this program are the following:<\/p>\n<pre class=\"lang:default decode:true \" >clang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -c greetings.cpp -Xclang -emit-module-interface -o greetings.pcm\r\nclang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. main.cpp greetings.cpp -o main<\/pre>\n<h2>Exporting templates<\/h2>\n<p>Templates can also be exported from a module. In the next example, a module called <strong>foo<\/strong>, available in a file <strong>foo.cpp<\/strong> exports a class template <tt>foo<\/tt> and a function template called <tt>make_foo<\/tt>.<\/p>\n<pre class=\"lang:c++ decode:true \" >export module foo;\r\n \r\nexport template &lt;typename T&gt;\r\nstruct foo\r\n{\r\n    T value;\r\n    \r\n    foo(T const v):value(v){}\r\n};\r\n \r\nexport template &lt;typename T&gt;\r\nfoo&lt;T&gt; make_foo(T const value)\r\n{\r\n    return foo&lt;T&gt;(value);\r\n}<\/pre>\n<p>The exports from this module can be used as follows in <strong>main.cpp<\/strong>:<\/p>\n<pre class=\"lang:c++ decode:true \" >import &lt;iostream&gt;;\r\nimport &lt;string&gt;;\r\nimport foo;\r\n \r\nint main()\r\n{\r\n    auto fi = make_foo(42);\r\n    std::cout &lt;&lt; fi.value &lt;&lt; '\\n';\r\n    \r\n    auto fs = make_foo(std::string(\"modules\"));\r\n    std::cout &lt;&lt; fs.value &lt;&lt; '\\n';\r\n}<\/pre>\n<p>To build this program, we must run the following commands:<\/p>\n<pre class=\"lang:default decode:true \" >clang++ -Wall -std=c++2a -fmodules -c foo.cpp -Xclang -emit-module-interface -o foo.pcm\r\nclang++ -Wall -std=c++2a -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. main.cpp foo.cpp -o main<\/pre>\n<h2>Partitions<\/h2>\n<p>As I mentioned in the beginning, Clang only supports C++20 modules partially. Unfortunately, this features is not available yet.<\/p>\n<h2>See also<\/h2>\n<p>You can learn more about Clang support for modules from the following articles:<\/p>\n<ul>\n<li><a href=\"https:\/\/clang.llvm.org\/docs\/ClangCommandLineReference.html\" rel=\"noopener noreferrer\" target=\"_blank\">Clang command line argument reference<\/a><\/li>\n<li><a href=\"https:\/\/quuxplusone.github.io\/blog\/2019\/11\/07\/modular-hello-world\/\" rel=\"noopener noreferrer\" target=\"_blank\">Hello World with C++2a modules<\/a><\/li>\n<li><a href=\"https:\/\/www.phoronix.com\/scan.php?page=news_item&#038;px=Clang-Cpp20-Modules-Switch\" rel=\"noopener noreferrer\" target=\"_blank\">Clang Flips On Modules Support With C++2A Switch<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/33307657\/how-do-i-use-c-modules-in-clang\" rel=\"noopener noreferrer\" target=\"_blank\">How do I use C++ modules in Clang?<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In my <a href=\"https:\/\/mariusbancila.ro\/blog\/2020\/05\/07\/modules-in-vc-2019-16-5\/\">previous post<\/a>, I wrote about the support for C++20 modules in Visual Studio 2019 16.5. VC++ is not the only major compiler that has experimental support for modules. Clang has its own implementation, although only partial. In this post, I will discuss the support available in Clang 11. You can check the current status <a href=\"https:\/\/clang.llvm.org\/cxx_status.html\" rel=\"noopener noreferrer\" target=\"_blank\">here<\/a>.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[451,543,624,477],"class_list":["post-3840","post","type-post","status-publish","format-standard","hentry","category-c","tag-c","tag-c20","tag-clang","tag-modules"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"c++,c++20,clang,modules\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Modules in Clang 11\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-15T12:58:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-15T12:58:01+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Modules in Clang 11\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#article\",\"name\":\"Modules in Clang 11\",\"headline\":\"Modules in Clang 11\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2020-05-15T14:58:01+02:00\",\"dateModified\":\"2020-05-15T14:58:01+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":4,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#webpage\"},\"articleSection\":\"C++, C++, c++20, clang, modules\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#listItem\",\"name\":\"Modules in Clang 11\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#listItem\",\"position\":5,\"name\":\"Modules in Clang 11\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/\",\"name\":\"Modules in Clang 11\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2020\\\/05\\\/15\\\/modules-in-clang-11\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2020-05-15T14:58:01+02:00\",\"dateModified\":\"2020-05-15T14:58:01+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Modules in Clang 11","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/","robots":"max-image-preview:large","keywords":"c++,c++20,clang,modules","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#article","name":"Modules in Clang 11","headline":"Modules in Clang 11","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2020-05-15T14:58:01+02:00","dateModified":"2020-05-15T14:58:01+02:00","inLanguage":"en-US","commentCount":4,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#webpage"},"articleSection":"C++, C++, c++20, clang, modules"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#listItem","name":"Modules in Clang 11"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#listItem","position":5,"name":"Modules in Clang 11","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/","name":"Modules in Clang 11","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2020-05-15T14:58:01+02:00","dateModified":"2020-05-15T14:58:01+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Modules in Clang 11","og:url":"https:\/\/mariusbancila.ro\/blog\/2020\/05\/15\/modules-in-clang-11\/","article:published_time":"2020-05-15T12:58:01+00:00","article:modified_time":"2020-05-15T12:58:01+00:00","twitter:card":"summary","twitter:title":"Modules in Clang 11"},"aioseo_meta_data":{"post_id":"3840","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:02:54","updated":"2025-12-12 07:54:48","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":4,"uagb_excerpt":"In my previous post, I wrote about the support for C++20 modules in Visual Studio 2019 16.5. VC++ is not the only major compiler that has experimental support for modules. Clang has its own implementation, although only partial. In this post, I will discuss the support available in Clang 11. You can check the current&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">c++20<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">clang<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">modules<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">c++20<\/span>","<span class=\"advgb-post-tax-term\">clang<\/span>","<span class=\"advgb-post-tax-term\">modules<\/span>"]}},"comment_count":"4","relative_dates":{"created":"Posted 6 years ago","modified":"Updated 6 years ago"},"absolute_dates":{"created":"Posted on May 15, 2020","modified":"Updated on May 15, 2020"},"absolute_dates_time":{"created":"Posted on May 15, 2020 2:58 pm","modified":"Updated on May 15, 2020 2:58 pm"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-ZW","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/3840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=3840"}],"version-history":[{"count":26,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/3840\/revisions"}],"predecessor-version":[{"id":3866,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/3840\/revisions\/3866"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=3840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=3840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=3840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}