| |||
Home > Language Extensions > Standard C++ language extensions > Read/write constants |
A linkage specification for external constants indicates that a constant can be dynamically initialized or have mutable members.
The use of "C++:read/write"
linkage is
only necessary for code compiled with --apcs /rwpi
.
If you recompile existing code with this option, you must change
the linkage specification for external constants that are dynamically
initialized or have mutable members.
Compiling C++ with the --apcs /rwpi
option
deviates from the ISO C++ Standard. The declarations in Example 3.1 assume that x
is
in a read-only segment.
Dynamic initialization of x
including user-defined
constructors is not possible for constants and T
cannot
contain mutable members. The new linkage specification in Example 3.2 declares
that x
is in a read/write segment even if it
is initialized with a constant. Dynamic initialization of x
is
permitted and T
can contain mutable members.
The definitions of x
, y
, and z
in
another file must have the same linkage specifications.
Example 3.2. Linkage specification
extern const int z; /* in read-only segment, cannot */ /* be dynamically initialized */ extern "C++:read/write" const int y; /* in read/write segment */ /* can be dynamically initialized */ extern "C++:read/write" { const int i=5; /* placed in read-only segment, */ /* not extern because implicitly static */ extern const T x=6; /* placed in read/write segment */ struct S { static const T T x; /* placed in read/write segment */ }; }
Constant objects must not be redeclared with another linkage. The code in Example 3.3 produces a compile error.
Because C does not have the linkage specifications, you cannot
use a const object declared in C++ as extern
"C++:read/write"
from C.