Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Click here to view the latest version of this page.


Boost.Wave: A Standard compliant C++ preprocessor library

Copyright (c) 2001-2005 Hartmut Kaiser. Distributed under the Boost
Software License, Version 1.0. (See accompanying file
LICENSE_1_0.txt or copy at

TODO (known issues):
- Fix expansion of macros, which replacement-list terminates in a partial 
  macro expansion.
- Fix the re2c lexer for iterators others then string::iterator (or more 
  generally for iterators, which aren't random access iterators)
- Try to remove the second parameter from the pp_iterator<>::force_include
- Fix the trigraph backslash problem in the re2c (C/C++ and IDL) scanners, if 
  there is the end of the (internal) buffer just in between a '??/' and a '\n'.
- Do a sourceforge release.



Boost V1.33.1
- Version 1.2.1
- Fixed bug reported as Sourceforge bug 1274584.
- Switched to Re2C V0.9.9.
- Fixed a bug where the 'parameters' and 'definition' parameters to the 
  defined_macro callback of the preprocessing hooks were always empty (thanks
  to Stefan Seefeld for reporting).
- Fixed missing namespace specifiers in token definition macros (thanks to 
  Jozsef Mihalicza for reporting).
- Enabled --preserved and --long_long modes by default for the cpp_tokens 
- Newline tokens reported a wrong line number (offset by one) when using the
  Re2C generated lexer (thanks to Jozsef Mihalicza for pointing this out).
- Changed file positions to carry 'unsigned int' line and column numbers.
- Fixed tokens of a generated #line directive to carry the correct column 
- Tokens now contain the correct filename, line and column numbers even if
  a #line directive was encountered.
- Fixed wrong line numbering in reference comments of the tests t_5_002.cpp and 
- Made sure, that preprocessor expression errors get ignored for 'passive' 
  #elif branches.
- Fixed an issue reported by the gcc debug stl.
- Added the <vc-7_1-stlport><*><rtti>off directive to all of the V1 Jamfiles.

Wed Aug 17 20:21:00 CST 2005
Boost V1.33.0
Version 1.2
- Fixed name clash wrt T_DIVIDE on FreeBSD.
- Fixed documentation of the different language_support flags.
- The support for long long suffixes is no longer bound to the variadics mode,
  it has to be enabled by the new long_long mode (default in C99).
- Fixed compilation if BOOST_WAVE_DUMP_PARSE_TREE is defined.
- Fixed lexer error message wrt long_long mode.
- Stefan Seefeld fixed a bug in the lexer, where include_next was assumed for
  includeed files containg a "include_" in their name.
- Fixed some trigraph token id's in the lexers.
- Added column information to the re2c generated lexer.
- Added tests for the different lexers.
- Fixed the found_include_directive preprocessing hook to carry the information
  about #include_next directives as well.
- Separated the different lexer tests.
- Fixed a bug in the whitespace eater.
- Fixed a bug where Wave emitted the found C++ comments in --preserve mode even
  if these were found inside of disabled #if/#endif blocks.
- Removed the function local static grammars to avoid possible raise conditions
  and to make CW8.3 happy.
- Unified lexer interface, adjusted namespaces.
- Added lexer testcases to the regression tests.
- Fixed test cases to scale to 64 bit platforms.
- Disabled the MS specific extensions in the lexer tests in a platform related
- Added special handling of the eof tokens inside the lexer iterator classes
  for Comeau.
- Applied a workaround proposed by David Abrahams to make the slex lexer work 
  on the CodeWarrior platforms.
Sun May  8 17:22:59 WEDT 2005
Version 1.1.17
- Added ill_formed_character_literal and ill_formed_integer_literal errors.
- Improved error handling and diagnostics for integer overflow in #if/#elif
- Fixed a bug in the testwave application which prevented the correct 
  recognition of expected errors under certain circumstances.
- Fixed a portability problem (for gcc 3.3.x) in the testwave application.
- Enforced that #if/#endif are balanced file wise.
- Changed the command line arguments for the Wave testrun to use absolute 
- Changed the test application to return a value != zero if one of the given 
  config files were not found.
- Fixed a command line parsing problem caused by a change in the parameter
  handling inside in the program_options library.
- Switched to the most recent version of re2c (
- Fixed a como compilation error and several como --a warnings.
- The T_EOF token doesn't carry the value of the previous token anymore.
- Added operator==() to the token classes to fix the ambiguity error reported
  by the True64 compiler.
- Improved the error message, when empty arguments are used in pure C++ mode.
- Added character literal out of range testing and an additional corresponding 
  error message.
- Fixed parsing of long character literals (such as '\x1234').
- Fixed almost all problems diagnosed by the Boost inspection report.
- Several fixes to make the True64 compiler happy.
- Added the long long suffix handling to the C99 mode (LL/ll).
- Fixed a bug in the slex regex specifications.

Thu Apr  7 10:07:45 WEDT 2005
Version 1.1.16
- Fixed a bug in the white space eating component, which prevented a C++ 
  comment to be suppressed if it followed after another whitespace.
- Fixed the inconsistencies between the documentation and the behaviour wrt the 
  different include search paths. See the Wave driver docs for details of how
  the '-I', '-I-', and '-S' options work.
- Allowed to specify more than one config file ('@' syntax) on the command line
  of the wave driver executable.
- Changed copyrights in all files to reflect the acceptance of Wave into Boost.
- Unknown preprocessing directives were not recognised as such anymore.
- If comments shouldn't be preserved all C++ comments are replaced by newline
  tokens (instead of beeing igored completely).
- Fixed a bug in the white space eater component.
- Fixed a bug which reported wrong line numbers for error encountered during 
  retokenisation (concatination).
- Fixed a bug in the unescaping code.
- Fixed a compilation error of the testwave executable (added a missing 
  namespace specifier).
- Added a missing header to make compile on CW.
- The predefined macro __BASE_FILE__ now returns a properly escaped file name 
- Fixed the function boost::wave::util::impl::unescape_lit().
- Added the Wave unit test framework. For now it contains about 60 unit tests
  executed by a special test driver (testwave).
- Added the '$F' replacement string to the testwave application. This allows
  to handle file paths sensitive comparison of the expected and real results.
- Fixed a minor problem in the whitespace eating component.
- Added optional trigraph conversion.
- Changed all size_t, time_t etc. to std::size_t, std::time_t etc (for CW).
- If the comments should not be preserved every C comment containing at minimum 
  one newline is now converted to a newline token.
- Added the lexed_tokens sample.
- Fixed warnings and errors reported by the CodeWarrior compiler.
- Added the '$V' replacement string to the testwave application. It expands to 
  the current BOOST_LIB_VERSION.
- Diagnosed the attempt to redefine the alternative operators as and, or etc.
- Improved error handling.
- Disabled the flex_string class for VC7, enabled to fallback to std::string 
  for this compiler.
- Renamed files to comply with the Boost rules.
- Added the first part of the MCPP validation suite to the Wave unit tests.
- Added even more missing "using namespace std;" staements for functions from
  the C runtime library. The Wave test suite now contains more than 100 unit
- Added the $P/$P(basename) replacement string to the testwave application 
  which expands to the full path of the current file ($P) or to the current 
  directory/basename ($P(basename)).
- Fixed a bunch of portability problmes revealed by the regression tests on
  different platforms. Thanks to Stefan Slapeda for his support to make it work
  on the cw-9_4 toolset (win32).
Tue Mar 22 14:52:45 WEST 2005
Version 1.1.15
- Fixed a bug where the complete set of C99 predefined macros were pre-defined
  when in C++ mode and variadics were enabled.
- When in variadics or C99 mode the __BASE_FILE__ predefined macro expanded to
- Added the --listincludes option to the Wave driver executable which allows to
  log the file names of the include files opened.
- Fixed a gcc warning in token_cache.hpp (unused variable end).
- Changed the logic behind #include_next. It now starts searching with the 
  next directory after the directory the current file (the file containing the 
  #include_next directive) is located in.
- Changed the signature of the undefined_macro preprocessing hook to take the 
  token itself and not the macro name only. This is important to pass the full
  context information about the position of the #undef directive to the 
  user provided hook (thanks to Stefan Seefeld for pointing that out).
- Fixed several broken links in the Context Policy topic.
- Fixed a bug in the handling of the #include_next directive inside of 
  non-evaluated #if blocks.
- Fixed a bug in the #include_next handling code (thanks to Stefan Seefeld).
- Changed the signature of the opened_include_file() preprocessing hook which 
  now receives not only the absolute file name of the openend include file but
  additionally gets passed the (possibly) relative path of the openend include
  file. This concrete format of the relative path depends on the format of the
  include search directory given to the library.
- Added a new preprocessing hook 'found_include_directive()' which gets called
  for every #include directive (even for those where the file to include 
  doesn't exist) and which gets passed the (expanded) token sequence found 
  after the #include directive token.
- The file names passed to the preprocessing hooks are now normalised.
- Changed the opened_include_file() preprocessing hook to receive the correct
  relative path even if the included file was found in the current directory.
- Fixed a bug which reported 'defined(or)' as invalid (similarly all the other
  alternative bit operation token types).
- Fixed a bug which prevented to define variadic macros from the command line.
- Added a 'preserve comments' mode to preserve the comments in the input stream
  not inserted into macro definitions.
- Added a new --preserve (-p) command line switch to the wave driver 
  application to allow comments to be preserved in the generated output stream.
Mon Feb 21 09:30:04 WEST 2005
Version 1.1.14 (Fixes in response to the Boost review)

Wave was accepted into Boost! 

With special thanks to Tom Brinkman, who volunteered to be the review manager.

With thanks to David Abrahams, Beman Dewes, Reece Dunn, Larry Evans, 
Doug Gregor, Joel de Guzman, Baptiste Lepilleur, Andy Little, Paul Mensonides, 
Dan Nuffer, Andreas Pokorny, Vladimir Prus, Gennadiy Rozental, Michiel Salters, 
Jonathan Turkanis, Chris Uzdavinis, Pavel Vozenilek, Michael Walter for bug 
reports, fixes and hints.

- Added support for the MS extensions #region and #endregion, which simply get
  ignored by Wave. The support for these is enabled only, when the pp constant
  BOOST_WAVE_SUPPORT_MS_EXTENSIONS is defined. Otherwise these get flagged as 
  an illegal preprocessor directive (as before).
- Fixed a problem, where the replacement text for a #pragma directive got lost
  if this directive was on the last line of a processed (include-)file.
- Changed the default value for BOOST_WAVE_SUPPORT_MS_EXTENSIONS for non-
  Windows systems to zero.
- Updated outdated external links in the documentation.
- Fixed certain grammatical and stylistic quirks in the documentation.
- Fixed a problem in libs/wave/build/Jamfile.v2 (as reported by Larry Evans).
  Fixed the Jamfile.v2 in the samples directories accordingly.
- Added the '<toolset>vc-7_1:<rtti>off' to all Jamfile.v2 files to adjust for 
  the internal buffer overflow bug in the VC7.1 compiler (reported by Joel de 
- Changed the '<toolset>vc-7_1:<rtti>off' to '<toolset>vc-7.1:<rtti>off' as
  required by the Boost.Build.v2 library (suggested by Vladimir Prus).
- Finally fixed the Jamfile.v2 file (after a suggestion from Reece Dunn)
- Fixed the column number reported for tokens for Slex lexer based 
  configurations (reported by Baptiste Lepilleur).
- Added the __BASE_FILE__ predefined macro, which contains a string literal 
  of the main file name to preprocess (the one the context<> template was
  created with). (suggested by Pavel Vozenilek)
- Used the boost::reverse_iterator instead of the std::reverse_iterator
  for the flex_string class to allow compilation of Wave with VC7.0
  (as suggested by Reece Dunn).
- Fixed a problem in the include_path template, which throwed a 
  boost::filesystem exception whenever a character was used in a file name
  to include, which is marked as illegal by the default name checker of the
Version 1.1.13 (Boost review candidate 2, bug fixed version)
- Fixed a problem, where the context<> template referenced temporary iterator
  objects from the underlying stream (thanks to Michiel Salters for reporting
- Fixed a bug in the re2c lexer, which allowed to dereference the end iterator 
  of the underlying input stream (thanks to Doug Gregor for pointing this out).
- Fixed several assertions fired by the iterator checking code of the VC8 stl.

Version 1.1.12 (Boost review candidate)
- A rough performance analysis showed, that 30% of the time is spent parsing 
  the input for pp directives (cpp_grammar), 35% of the time is spent inside
  the flex_string code, mainly in the copy constructor and assignment 
  operator, 15% of the time is spent inside the list and vector member 
  functions, 10% is spent for memory allocation but only 1% of the time is 
  spent in the re2c lexer.
- Identified a performance problem, where the token_cache was instantiated
  for every created lexer object, but needed to be initialised only once.
- Added #include <wave_version.hpp> to wave_config.hpp
- Fixed problems reported by the gcc 3.4.1 compiler.
- Adjusted Jamfiles for the new toolset names introduced in Boost V1.32.

Version 1.1.11
- Updated copyrights.
- Fixed some bugs introduced by the latest refactoring.
- Tried to fix the expansion of macros, which replacement-list terminates in a 
  partial macro expansion. No success so far.

Version 1.1.10
- Refactored some of the macro map (macro namespace) code (added comments, 
  splitted into separate files),
- Fixed some typename errors in cpp_macromap.hpp (thanks to Vladimir Prus).
- Fixed the BoostBuild V2 Jamfiles (thanks to Vladimir Prus).

Version 1.1.9
- Moved all of the #pragma wave option(value) operators out of the wavelib into 
  the wave driver program. Removed enable_trace() and trace_flags() policy
  functions. Renamed trace_policy into context_policy.
- Added the defined_macro() and undefined_macro() preprocessing hooks to allow
  easily to build macro cross referencers and such.

Version 1.1.8
- Replaced the usage of the string::erase() and string::insert() functions, 
  which were the only non-const string member functions used.
- Token pasting is now well defined in variadics mode (was in C++0x mode only).
- Changed the timing code in the wave driver to include the parsing of 
  files included by the --forceinclude command line switch.
- Performance measurements (very informal) [sec], the files are some of the
  preprocessor specific test cases from Paul Mensonides chaos_pp library.

                        std::string   flex_string   const_string   const_string
                                                      12 Byte        28 Byte
    arithmetic.cpp        2.543          1.742         0.951           1.001
    array.cpp             2.453          1.762         0.951           1.011
    comparison.cpp        0.560          0.340         0.270           0.280
    control.cpp           0.590          0.340         0.290           0.300
    debug.cpp             0.370          0.310         0.190           0.190
    detection.cpp         0.050          0.060         0.030           0.030
    extended.cpp          0.370          0.260         0.190           0.190
    facilities.cpp        0.610          0.340         0.290           0.300
    iteration.cpp         1.081          0.550         0.410           0.450
    list.cpp              1.742          1.141         0.811           0.851
    logical.cpp           0.070          0.200         0.040           0.040
    punctuation.cpp       0.030          0.080         0.020           0.020
    repetition.cpp        1.392          0.851         0.650           0.690
    selection.cpp         0.440          0.270         0.210           0.220
    slot.cpp              0.680          0.350         0.240           0.270
    tuple.cpp             0.420          0.240         0.190           0.210

Wed Aug 25 13:23:27 WEDT 2004
Version 1.1.7
- Branched for Boost Release.
- Removed several features from the code base:
  . removed C++0x support
  . removed TST support
- Fixed the program_option validator syntax, which has changed since the last 
- Removed misleading configuration options from the cpp_config.hpp file, 
  because the application will have to use the same config options as were used
  during the compilation of the library.
- Changed the naming convention of typedef'd types in the library. Removed the 
  _t suffix, wherever possible.
- Updated the documentation to reflect the removal of the C++0x features.

- Changed the licensing scheme to:
// Copyright 2004 Joe Coder. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at