![]() |
Home | Libraries | People | FAQ | More |
This section shows how to setup and start using this library.
Programmers should be able to start using this library after reading the Introduction, Getting Started, and Tutorial. Other sections of this documentation (e.g., Advanced and Extras) can be consulted at a later point to gain a more in-depth knowledge of the library. Contract Programming Overview can be skipped by programmers that are already familiar with the contract programming methodology.
Some of the source code listed in this documentation contains special code
comments of the form //[...
and //]
. These mark sections
of the code that are automatically extracted from the source code and presented
as part of this documentation. [5] It should be noted that the purpose of all examples of this documentation
is to illustrate how to use this library and not to show real production
code.
Some footnotes are marked by the word "Rationale". These explain some of the decisions made during the design and implementation of this library.
In general, this library requires C++ compilers with a sound implementation of SFINAE and other template meta-programming techniques supported by the C++03 standard. It is possible to use this library without C++11 lambda functions but a large amount of boiler-plate code is required to manually program separate functors to specify preconditions, postconditions, etc. (so using this library without C++11 lambda functions is possible but not recommended, see No Lambda Functions). It is also possible to use this library without variadic macros by manually programming a small amount of boiler-plate code (but most if not all modern C++ compilers support variadic macros even before C++99 and C++11 so this should never be needed in practice, see No Macros).
Some parts of this documentation use the syntax type-of(...)
to indicate an operator logically equivalent to C++11 decltype(...)
. However, this library implementation
does not actually use type deduction in these cases (because the library
internally already knows the types in question) so support for C++11 decltype
and other type-of implementations
are not actually required (that is why type-of
and not the real decltype
operator
is used in this documentation).
This library has been developed and tested using:
cl
version 19.00.24215.1).
-std=c++11
).
-std=c++11
).
For information on other compilers and platforms see the library regression tests. The development and maintenance of this library is hosted on GitHub.
Let boost-root
be the directory where
Boost source files were installed. This library flies are organized as follows:
boost-root/libs/contract # Directory where this library files are. build/ # Build files (using BJam). doc/ # Documentation (using Boost.QuickBook). example/ # Examples (also those listed in this documentation). include/ # DO NOT USE: Use copies of these files from boost/ # boost-root/boost/ instead: contract.hpp # - Include all headers at once. contract_macro.hpp # - Include library macro interface. contract/ # - Header files that can be included one-by-one. core/ # - Fundamental headers (usually indirectly included by other headers). detail/ # - Implementation code (should never be included or used directly). src/ # Library source code to be compiled. test/ # Tests.
All headers required by this library can be included at once by:
#include <boost/contract.hpp>
Or, by the following when using the library macro interface (see Disable Contract Compilation):
#include <boost/contract_macro.hpp>
Alternatively, all boost/contract/*.hpp
headers are independent
from one another and they can be selectively included one-by-one based on
the specific functionality of this library being used (but this was measured
to not make an appreciable difference in compile-time so boost/contract.hpp
can be included directly in most cases). The boost/contract/core/*.hpp
headers are not independent from other headers and they do not need to be
directly included in user code when boost/contract.hpp
or boost/contract/*.hpp
headers are included already.
All files under boost/contract/detail/
, names in the
boost::contract::detail
namespace, macros starting with
BOOST_CONTRACT_DETAIL...
,
and all names starting with boost_contract_detail...
(in any namespace, including user-defined
namespaces) are part of this library implementation and should never be used
directly in user code. Names starting with BOOST_CONTRACT_ERROR...
are used by this library to report some
compile-time errors (so spotting these names in compiler error messages might
help troubleshooting).
Let boost-root
be the directory where
Boost source files were installed. This library is installed and compiled
as part of Boost using BJam.
![]() |
Warning |
---|---|
It is strongly recommended to compile and use this library as a shared
library (a.k.a., Dynamically Linked Library or DLL) by defining the
It is also possible to compile and use this library as a static library
(by defining the |
For example, to build all Boost libraries including this one (as shared libraries, see also Boost documentation):
$ cd boost-root
$ ./bootstrap.sh
$ ./bjam
To compile and run the boost-root/libs/contract/example/features/introduction.cpp
example:
$ cd boost-root/libs/contract/example
$ ../../../bjam features-introduction
To compile and run all this library's tests (this might take while):
$ cd boost-root/libs/contract/test
$ ../../../bjam
To compile and run code that uses this library but without BJam (similarly for Clang):
$ cd /tmp $ g++ -std=c++11 -D BOOST_CONTRACT_DYN_LINK -I boost-root boost-root/stage/lib/system-prefixboost_contract.dll boost-root/libs/contract/example/features/introduction.cpp -o introduction $ export PATH=$PATH:boost-root/stage/lib $ ./introduction
For example, to build all Boost libraries including this one (as DLLs, see also Boost documentation):
>cd boost-root
>bootstrap.bat
>bjam
To compile and run the boost-root/libs/contract/example/features/introduction.cpp
example:
>cd boost-root\libs\contract\example
>..\..\..\bjam features-introduction
To compile and run all this library's tests (this might take while):
>cd boost-root\libs\contract\test
>..\..\..\bjam
To compile and run code that uses this library but without BJam:
>cd C:\Temp >cl /MDd /EHs /std:c++11 /D BOOST_CONTRACT_DYN_LINK /I boost-root /link /DLL /LIBPATH:boost-root\stage\lib boost-root\libs\contract\example\features\introduction.cpp /out:introduction >set PATH=%PATH%;boost-root/stage/lib >introduction
[5] Rationale: This allows to make sure that most of the example code presented in this documentation is always up-to-date, builds and runs with the latest implementation of the library.