PRB: Constant String Is Eliminated by the C++ Compiler (87634)
The information in this article applies to:
- Microsoft Visual C++ for Windows, 16-bit edition 1.0
- Microsoft Visual C++ for Windows, 16-bit edition 1.5
- Microsoft Visual C++ for Windows, 16-bit edition 1.51
- Microsoft Visual C++ for Windows, 16-bit edition 1.52
- Microsoft Visual C++, 32-bit Editions 1.0
- Microsoft Visual C++, 32-bit Editions 2.0
- Microsoft Visual C++, 32-bit Editions 2.1
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.1
- Microsoft Visual C++, 32-bit Editions 4.2
- Microsoft Visual C++, 32-bit Editions 5.0
- Microsoft Visual C++, 32-bit Editions 6.0
This article was previously published under Q87634 SYMPTOMS
The Microsoft C/C++ versions 7.0 and later compilers eliminate unreferenced
constant strings. This happens only with C++ source, not C source. The
string is declared in the source file, but is not included in the resulting
object module.
CAUSE
In C++, const variables have internal linkage. This is different from the
way that C handles const variables.
In this case, because the C++ compiler can process only one source file
at a time, the string is eliminated if it is not referenced in the file
in which it is declared, even if it is referenced from another file.
RESOLUTION
The solution is to declare the const string as "extern". This provides
external linkage, telling the compiler that the string may be used in
another module, and not to assume that it is an unreferenced symbol;
for example
const char sz[] = "\"the string\"";
would be optimized away in a C++ module, but the following string would
not:
extern const char sz[] = "\"the string"\";
MORE INFORMATION
While this behavior is not a bug in the compiler, the effects of this
optimization may cause unexpected results. If a string is declared and
initialized in one module, and referenced only in another module, the
string will be eliminated from the first module. This means that the other
file will not have access to the information used in the initialization of
the string.
For more information on internal and external linkage, see section 2.4 of
the ""C++ Language Reference"" supplied with C/C++ version 7.0 and Visual
C++, or refer to the online help supplied with Visual C++.
Modification Type: | Major | Last Reviewed: | 12/11/2003 |
---|
Keywords: | kbCompiler kbCPPonly kbprb KB87634 |
---|
|