| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <title>Portability Hints: Microsoft Visual C++ 6.0 SP4</title>
- </head>
- <body bgcolor="#FFFFFF" text="#000000">
- <table border="1" bgcolor="#007F7F" cellpadding="2">
- <tr>
- <td bgcolor="#FFFFFF"><img src="../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86"></td>
- <td><a href="../index.htm"><font face="Arial,Helvetica" color="#FFFFFF"><big>Home</big></font></a></td>
- <td><a href="../libs/libraries.htm"><font face="Arial,Helvetica" color="#FFFFFF"><big>Libraries</big></font></a></td>
- <td><a href="../people/people.htm"><font face="Arial,Helvetica" color="#FFFFFF"><big>People</big></font></a></td>
- <td><a href="faq.htm"><font face="Arial,Helvetica" color="#FFFFFF"><big>FAQ</big></font></a></td>
- <td><a href="index.htm"><font face="Arial,Helvetica" color="#FFFFFF"><big>More</big></font></a></td>
- </tr>
- </table>
- <p>
- <h1>Portability Hints: Microsoft Visual C++ 6.0 SP4</h1>
- Similar to the
- <a href="borland_cpp.html">portability hints for Borland C++</a>,
- this page provides hints on some language features of the Microsoft Visual C++
- version 6.0 service pack 4 compiler. A list of
- acknowledged deficiencies can be found at the
- <a href="http://support.microsoft.com/support/kb/articles/q243/4/51.asp">Microsoft support site</a>.
- <p>
- Each entry in the following list describes a particular issue,
- complete with sample source code to demonstrate the effect.
- Most sample code herein has been verified to compile with gcc 2.95.2
- and Comeau C++ 4.2.44.
- <h2>Preprocessor symbol</h2>
- The preprocessor symbol <code>_MSC_VER</code> is defined for all
- Microsoft C++ compilers. Its value is the internal version number of the
- compiler interpreted as a decimal number. Since a few other compilers
- also define this symbol, boost provides the symbol
- <code>BOOST_MSVC</code>, which is defined in
- <a href="../boost/config.hpp">boost/config.hpp</a>
- to the value of _MSC_VER if and only if the compiler is really
- Microsoft Visual C++.
- The following table lists some known values.
- <p>
- <table border="1">
- <tr>
- <th>Compiler</th>
- <th><code>BOOST_MSVC</code> value</th>
- </tr>
- <tr>
- <td>Microsoft Visual C++ 6.0 SP4</td>
- <td>1200</td>
- </tr>
- </table>
- <h2>Core Language</h2>
- <h3>[chained using] Chaining <code>using</code>-declarations</h3>
- Chaining <code>using</code>-declarations do not work.
- <pre>
- void f();
- namespace N {
- using ::f;
- }
- void g()
- {
- using N::f; // C2873: 'f': the symbol cannot be used in a using-declaration
- }
- </pre>
- <h3>[explicit-instantiation] Explicit function template
- instantiation</h3>
- Trying to explicitly instantiate a function template leads to the
- wrong function being called silently.
- <pre>
- #include <stdio.h>
- template<class T>
- void f()
- {
- printf("%d\n", sizeof(T));
- }
- int main()
- {
- f<double>(); // output: "1"
- f<char>(); // output: "1"
- return 0;
- }
- </pre>
- <h3>[for-scoping] Scopes of definitions in for-loops</h3>
- The scope of variable definitions in <code>for</code> loops should be
- local to the loop's body, but it is instead local to the enclosing
- block.
- <pre>
- int main()
- {
- for(int i = 0; i < 5; ++i)
- ;
- for(int i = 0; i < 5; ++i) // C2374: 'i': Redefinition; multiple initialization
- ;
- return 0;
- }
- </pre>
- <strong>Workaround:</strong> Enclose the offending <code>for</code>
- loops in another pair of curly braces.
- <h3>[inclass-member-init] In-class member initialization</h3>
- In-class member initialization, require to implement a
- Standard-conforming <code>std::numeric_limits</code> template, does
- not work.
- <pre>
- struct A
- {
- static const int i = 5; // "invalid syntax for pure virtual method"
- };
- </pre>
- <h3>[koenig-lookup] Argument-dependent lookup</h3>
- Argument-dependent lookup, also called Koenig lookup, does not work.
- No additional namespaces induced from the argument types seem to be
- considered.
- <pre>
- namespace N {
- struct A {};
- void f(A);
- }
- void g()
- {
- N::A a;
- f(a); // 'f': undeclared identifier
- }
- </pre>
- <h3>[template-friend] Templates as friends</h3>
- A Template cannot be declared a friend of a class.
- <pre>
- template<class T>
- struct A {};
- struct B
- {
- template<class T>
- friend struct A; // "syntax error"
- };
- </pre>
- <h3>[member-template-outofline] Out-of-line definitions of member
- templates</h3>
- Defining member templates outside their enclosing class does not work.
- <pre>
- template<class T>
- struct A
- {
- template<class U>
- void f();
- };
- template<class T>
- template<class U> // "syntax error"
- void A<T>::f() // "T: undeclared identifier"
- {
- }
- </pre>
- <strong>Workaround:</strong> Define member templates in-line within
- their enclosing class.
- <h3>[partial-spec] Partial specialization</h3>
- Partial specialization of class templates does not work.
- <pre>
- template<class T>
- struct A {};
- template<class T>
- struct B {};
- template<class T>
- struct A<B<T> > {}; // template class was already defined as a non-template
- </pre>
- <strong>Workaround:</strong> In some situations where interface
- does not matter, member class templates can simulate partial
- specialization.
- <h3>[template-value] Dependent template value parameters</h3>
- Template value parameters whose type depends on a previous template
- parameter provoke an internal compiler error if the correct syntax
- (with "typename") is used.
- <pre>
- template<class T, typename T::result_type> // C1001: INTERNAL COMPILER ERROR: msc1.cpp, line 1794
- struct B {};
- // (omit "typename" and it compiles)
- </pre>
- <h3>[wchar_t] <code>wchar_t</code> is not built-in</h3>
- The type <code>wchar_t</code> is not a built-in type.
- <pre>
- wchar_t x; // "missing storage class or type identifier"
- </pre>
- <strong>Workaround:</strong> When using Microsoft Visual C++, the
- header
- <a href="../boost/config.hpp">boost/config.hpp</a>
- includes <code><cstddef></code>, which defines defines
- <code>wchar_t</code> as a typedef for <code>unsigned
- short</code>. Note that this means that the compiler does not see
- <code>wchar_t</code> and <code>unsigned short</code> as distinct
- types, as is required by the standard, and so ambiguities may emanate
- when overloading on <code>wchar_t</code>. The macro
- <code>BOOST_NO_INTRINSIC_WCHAR_T</code> is defined in this situation.
- <h2>
- Standard Library</h2>
- <h3>[clib-namespace] C library names in global namespace instead of std</h3>
- <p>Library names from the <c...> headers are in the global namespace
- instead of namespace std.<p><b>Workaround:</b> The header <a href="../libs/config/index.htm">boost/config.hpp</a>
- will define BOOST_NO_STDC_NAMESPACE. It can be used as follows:
- <pre># ifdef BOOST_NO_STDC_NAMESPACE
- namespace std { using ::abs; using ::fabs; }
- # endif</pre>
- <p>Because std::size_t and std::ptrdiff_t are so commonly used, the workaround
- for these is already provided in boost/config.hpp.<p>
- <hr>
- 2001-02-01 <a href="../people/jens_maurer.htm">Jens Maurer</a>
- </body>
- </html>
|