Skip to content

Commit 2ca63d4

Browse files
authored
Merge pull request #3141 from corob-msft/docs/corob/16-8-modules
VS 16.8 Add commands for modules
2 parents a7f4f49 + bada182 commit 2ca63d4

6 files changed

Lines changed: 317 additions & 0 deletions

File tree

docs/build/reference/experimental-module.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ cl /EHsc /MD /experimental:module /module:export /module:name ModuleName /module
3939

4040
## See also
4141

42+
[`/headerUnit` (Use header unit IFC)](headerunit.md)\
43+
[`/module:exportHeader` (Create header units)](module-exportheader.md)\
44+
[`/module:reference` (Use named module IFC)](module-reference.md)\
45+
[`/translateInclude` (Translate include directives into import directives)](translateinclude.md)\
4246
[/Zc (Conformance)](zc-conformance.md)

docs/build/reference/headerunit.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
---
2+
title: "/headerUnit (Use header unit IFC)"
3+
description: "Use the /headerUnit compiler option to specify an existing IFC header unit to import in the current compilation."
4+
ms.date: 09/13/2020
5+
f1_keywords: ["/headerUnit"]
6+
helpviewer_keywords: ["/headerUnit", "Use header unit IFC"]
7+
---
8+
# `/headerUnit` (Use header unit IFC)
9+
10+
Tells the compiler to translate `#include` directives for an importable header-name into an `import header-name;` directive, rather than use textual inclusion.
11+
12+
## Syntax
13+
14+
> **`/headerUnit`** *`header-filename`*=*`ifc-filename`*
15+
16+
### Arguments
17+
18+
*`header-filename`*\
19+
The name of a file that the compiler resolves a `header-name` to. During `import header-name ;` the compiler resolves `header-name` to some file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import.
20+
21+
*`ifc-filename`*\
22+
The name of a file that contains *IFC data*, prebuilt module information. To import more than one header unit, include a separate **`/headerUnit`** option for each file.
23+
24+
## Remarks
25+
26+
The **`/headerUnit`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8.
27+
28+
The compiler can't map a single *`header-name`* to multiple IFC files. While mapping multiple *`header-name`* arguments to a single IFC is possible, we don't recommend it. The contents of the IFC get imported as if it was only the header specified by *`header-name`*.
29+
30+
### Examples
31+
32+
Given a project that references two header files and their header units, listed in this table:
33+
34+
| Header file | IFC file |
35+
|--|--|
36+
| *`C:\utils\util.h`* | *`C:\util.h.ifc`* |
37+
| *`C:\app\app.h`* | *`C:\app.h.ifc`* |
38+
39+
The compiler options to reference the header units for these particular header files might look like this example:
40+
41+
```CMD
42+
cl ... /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc
43+
```
44+
45+
### To set this compiler option in the Visual Studio development environment
46+
47+
1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md).
48+
49+
1. Set the **Configuration** drop-down to **All Configurations**.
50+
51+
1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page.
52+
53+
1. Modify the **Additional Options** property to add the *`/headerUnit`* options and arguments. Then, choose **OK** or **Apply** to save your changes.
54+
55+
## See also
56+
57+
[`/experimental:module` (Enable module support)](experimental-module.md)\
58+
[`/module:exportHeader` (Create header units)](module-exportheader.md)\
59+
[`/module:reference` (Use named module IFC)](module-reference.md)\
60+
[`/translateInclude` (Translate include directives into import directives)](translateinclude.md)\
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
title: "/module:exportHeader (Create header units)"
3+
description: "Use the /module:exportHeader compiler option to create module header units for the header-name or include files specified."
4+
ms.date: 09/13/2020
5+
f1_keywords: ["/module:exportHeader"]
6+
helpviewer_keywords: ["/module:exportHeader", "Create header units"]
7+
---
8+
# `/module:exportHeader` (Create header units)
9+
10+
Tells the compiler to create the header units specified by the input arguments. The compiler generates output in IFC (*`.ifc`*) files.
11+
12+
## Syntax
13+
14+
> **`/module:exportHeader`** *`header-name`* \[...]\
15+
> **`/module:exportHeader`** *`filename`* \[...]
16+
17+
### Arguments
18+
19+
*`header-name`*\
20+
The header file to export. The *`header-name`* argument must take the same form as an argument to an `#include` directive.
21+
22+
*`filename`*\
23+
The relative or absolute path to the header file to create a header unit from.
24+
25+
## Remarks
26+
27+
The **`/module:exportHeader`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8.
28+
29+
One **`/module:exportHeader`** compiler option can specify as many header-name arguments as your build requires. You don't need to specify them separately.
30+
31+
By default, the compiler doesn't produce an object file when a header unit is compiled. To produce an object file, specify the **`/Fo`** compiler option. For more information, see [`/Fo` (Object File Name)](fo-object-file-name.md).
32+
33+
The compiler resolves a *`header-name`* based on the include directory search order, including any you specify. For more information, see [`/I` (Additional include directories)](i-additional-include-directories.md).
34+
35+
The argument *`header-name`* must be specified the same way it would appear in source. The argument is sensitive to quoting rules and to `<` and `>` operators on the command line. The properly escaped command to build a header unit such as `<vector>` using the VS2019 command prompt might look like:
36+
37+
```cmd
38+
cl ... /experimental:module /module:exportHeader "<vector>"
39+
```
40+
41+
Building a local project header such as `"utils/util.h"` might look like:
42+
43+
```cmd
44+
cl ... /experimental:module /module:exportHeader """util/util.h"""
45+
```
46+
47+
The quoting rules in other command-line processors may differ.
48+
49+
When using the *`header-name`* form of **`/module:exportHeader`**, you may find it's helpful to use the complementary option **`/module:showResolvedHeader`**. The **`/module:showResolvedHeader`** option prints an absolute path to the file the *`header-name`* argument resolves to.
50+
51+
**`/module:exportHeader`** can handle multiple inputs at once even under **`/MP`**. We recommended you use **`/module:output <directory>`** to create a separate IFC file for each compilation.
52+
53+
### Examples
54+
55+
Given headers `"C:\util\util.h"` and `"C:\app\app.h"`, you can export them as *`header-name`* arguments by using this command:
56+
57+
```cmd
58+
cl /IC:\ /experimental:module /module:exportHeader """util/util.h""" """app/app.h""" /FoC:\obj
59+
```
60+
61+
You can export them as *`filename`* arguments by using this command:
62+
63+
```cmd
64+
cl /IC:\ /experimental:module /module:exportHeader C:\util\util.h C:\app\app.h /FoC:\obj
65+
```
66+
67+
### To set this compiler option in the Visual Studio development environment
68+
69+
1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md).
70+
71+
1. Set the **Configuration** drop-down to **All Configurations**.
72+
73+
1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page.
74+
75+
1. Modify the **Additional Options** property to add the *`/module:exportHeader`* option and any arguments. Then, choose **OK** or **Apply** to save your changes.
76+
77+
## See also
78+
79+
[`/experimental:module` (Enable module support)](experimental-module.md)\
80+
[`/headerUnit` (Use header unit IFC)](headerunit.md)\
81+
[`/module:reference` (Use named module IFC)](module-reference.md)\
82+
[`/translateInclude` (Translate include directives into import directives)](translateinclude.md)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
title: "/module:reference (Use named module IFC)"
3+
description: "Use the /module:reference compiler option to create module header units for the header-name or include files specified."
4+
ms.date: 09/13/2020
5+
f1_keywords: ["/module:reference"]
6+
helpviewer_keywords: ["/module:reference", "Use named module IFC"]
7+
---
8+
# `/module:reference` (Use named module IFC)
9+
10+
Tells the compiler to use an existing IFC (*`.ifc`*) for the current compilation.
11+
12+
## Syntax
13+
14+
> **`/module:reference`** *`module-name=filename`*\
15+
> **`/module:reference`** *`filename`*
16+
17+
### Arguments
18+
19+
*`filename`*\
20+
The name of a file that contains *IFC data*, prebuilt module information. To import more than one module, include a separate **`/module:reference`** option for each file.
21+
22+
*`module-name`*\
23+
A valid name of an exported primary module interface unit name or full module partition name.
24+
25+
## Remarks
26+
27+
The **`/module:reference`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8.
28+
29+
If the **`/module:reference`** argument is a *`filename`* without a *`module-name`*, the file gets opened at runtime to verify the *`filename`* argument names a specific import. It can result in slower runtime performance in scenarios that have many **`/module:reference`** arguments.
30+
31+
The *`module-name`* must be a valid primary module interface unit name or full module partition name. Examples of primary module interface names include:
32+
33+
- `M`
34+
- `M.N.O`
35+
- `MyModule`
36+
- `my_module`
37+
38+
Examples of full module partition names include:
39+
40+
- `M:P`
41+
- `M.N.O:P.Q`
42+
- `MyModule:Algorithms`
43+
- `my_module:algorithms`
44+
45+
If a module reference is created using a *`module-name`*, other modules on the command line don't get searched if the compiler encounters an import of that name. For example, given this command line:
46+
47+
```cmd
48+
cl ... /experimental:module /module:reference m.ifc /module:reference m=n.ifc
49+
```
50+
51+
In the case above, if the compiler sees `import m;` then *`m.ifc`* doesn't get searched.
52+
53+
### Examples
54+
55+
Given three modules as listed in this table:
56+
57+
| Module | IFC file |
58+
|--|--|
59+
| *`M`* | *`m.ifc`* |
60+
| *`M:Part1`* | *`m-part1.ifc`* |
61+
| *`Core.Networking`* | *`Networking.ifc`* |
62+
63+
The reference options using a *`filename`* argument could look like:
64+
65+
```cmd
66+
cl ... /experimental:module /module:reference m.ifc /module:reference m-part.ifc /module:reference Networking.ifc
67+
```
68+
69+
The reference options using *`module-name=filename`* could look like:
70+
71+
```cmd
72+
cl ... /experimental:module /module:reference m=m.ifc /module:reference M:Part1=m-part.ifc /module:reference Core.Networking=Networking.ifc
73+
```
74+
75+
### To set this compiler option in the Visual Studio development environment
76+
77+
1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md).
78+
79+
1. Set the **Configuration** drop-down to **All Configurations**.
80+
81+
1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page.
82+
83+
1. Modify the **Additional Options** property to add the *`/module:reference`* option and its arguments. Then, choose **OK** or **Apply** to save your changes.
84+
85+
## See also
86+
87+
[`/experimental:module` (Enable module support)](experimental-module.md)\
88+
[`/headerUnit` (Use header unit IFC)](headerunit.md)\
89+
[`/module:exportHeader` (Create header units)](module-exportheader.md)\
90+
[`/translateInclude` (Translate include directives into import directives)](translateinclude.md)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
---
2+
title: "/translateInclude (Translate include directives into import directives)"
3+
description: "Use the /translateInclude compiler option to translate #include directives for an importable header-name into an import header-name directive."
4+
ms.date: 09/13/2020
5+
f1_keywords: ["/translateInclude"]
6+
helpviewer_keywords: ["/translateInclude", "Translate include directives into import directives"]
7+
---
8+
# `/translateInclude` (Translate include directives into import directives)
9+
10+
Tells the compiler to translate `#include` directives for an importable header-name into an `import header-name;` directive, rather than use textual inclusion.
11+
12+
## Syntax
13+
14+
> **`/translateInclude`**
15+
16+
## Remarks
17+
18+
The **`/translateInclude`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8.
19+
20+
The **`/translateInclude`** option effectively makes the following transformation, where the example `<vector>` is an importable header unit:
21+
22+
```cpp
23+
#include <vector>
24+
```
25+
26+
The compiler replaces this directive with:
27+
28+
```cpp
29+
import <vector> ;
30+
```
31+
32+
In MSVC an importable header unit is one named by a **`/headerUnit`** reference. For more information, see [`/headerUnit` (Use header unit IFC)](headerunit.md).
33+
34+
### Examples
35+
36+
Given a project that references two header files and their header units, listed in this table:
37+
38+
| Header file | IFC file |
39+
|--|--|
40+
| *`C:\utils\util.h`* | *`C:\util.h.ifc`* |
41+
| *`C:\app\app.h`* | *`C:\app.h.ifc`* |
42+
43+
And a source *`.cpp`* file that includes the headers,
44+
45+
```cpp
46+
#include "utils/util.h"
47+
#include "app/app.h"
48+
49+
int main() { }
50+
```
51+
52+
The **`/translateInclude`** option allows the compiler to import the header units instead of compile the headers again. Here's an example command line that translates the include directives for *`util.h`* and *`app.h`* into imports of the header units instead:
53+
54+
```CMD
55+
cl /IC:\ /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc
56+
```
57+
58+
### To set this compiler option in the Visual Studio development environment
59+
60+
1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md).
61+
62+
1. Set the **Configuration** drop-down to **All Configurations**.
63+
64+
1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page.
65+
66+
1. Modify the **Additional Options** property to add the *`/translateInclude`* option. Then, choose **OK** or **Apply** to save your changes.
67+
68+
## See also
69+
70+
[`/experimental:module` (Enable module support)](experimental-module.md)\
71+
[`/headerUnit` (Use header unit IFC)](headerunit.md).\
72+
[`/module:exportHeader` (Create header units)](module-exportheader.md)\
73+
[`/module:reference` (Use named module IFC)](module-reference.md)

docs/build/toc.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@
583583
href: ../build/reference/gz-enable-stack-frame-run-time-error-checking.md
584584
- name: /H (Restrict length of external names)
585585
href: ../build/reference/h-restrict-length-of-external-names.md
586+
- name: /headerUnit (Use header unit IFC)
587+
href: ../build/reference/headerunit.md
586588
- name: /HELP (Compiler command-line help)
587589
href: ../build/reference/help-compiler-command-line-help.md
588590
- name: /homeparams (Copy register parameters to stack)
@@ -603,6 +605,10 @@
603605
href: ../build/reference/ln-create-msil-module.md
604606
- name: /MD, /MT, /LD (Use Run-time library)
605607
href: ../build/reference/md-mt-ld-use-run-time-library.md
608+
- name: /module:exportHeader (Create header units)
609+
href: ../build/reference/module-exportheader.md
610+
- name: /module:reference (Use named module IFC)
611+
href: ../build/reference/module-reference.md
606612
- name: /MP (Build with multiple processes)
607613
href: ../build/reference/mp-build-with-multiple-processes.md
608614
- name: /nologo (Suppress startup banner) (C/C++)
@@ -675,6 +681,8 @@
675681
href: ../build/reference/std-specify-language-standard-version.md
676682
- name: /Tc, /Tp, /TC, /TP (Specify source file type)
677683
href: ../build/reference/tc-tp-tc-tp-specify-source-file-type.md
684+
- name: /translateInclude (Translate include directives into import directives)
685+
href: ../build/reference/translateinclude.md
678686
- name: /U, /u (Undefine symbols)
679687
href: ../build/reference/u-u-undefine-symbols.md
680688
- name: /utf-8 (Set source and executable character sets to UTF-8)

0 commit comments

Comments
 (0)