1.. _using-libcxx: 2 3============ 4Using libc++ 5============ 6 7.. contents:: 8 :local: 9 10Usually, libc++ is packaged and shipped by a vendor through some delivery vehicle 11(operating system distribution, SDK, toolchain, etc) and users don't need to do 12anything special in order to use the library. 13 14This page contains information about configuration knobs that can be used by 15users when they know libc++ is used by their toolchain, and how to use libc++ 16when it is not the default library used by their toolchain. 17 18 19Using a different version of the C++ Standard 20============================================= 21 22Libc++ implements the various versions of the C++ Standard. Changing the version of 23the standard can be done by passing ``-std=c++XY`` to the compiler. Libc++ will 24automatically detect what Standard is being used and will provide functionality that 25matches that Standard in the library. 26 27.. code-block:: bash 28 29 $ clang++ -std=c++17 test.cpp 30 31.. warning:: 32 Using ``-std=c++XY`` with a version of the Standard that has not been ratified yet 33 is considered unstable. Libc++ reserves the right to make breaking changes to the 34 library until the standard has been ratified. 35 36 37Enabling experimental C++ Library features 38========================================== 39 40Libc++ provides implementations of some experimental features. Experimental features 41are either Technical Specifications (TSes) or official features that were voted to 42the Standard but whose implementation is not complete or stable yet in libc++. Those 43are disabled by default because they are neither API nor ABI stable. However, the 44``_LIBCPP_ENABLE_EXPERIMENTAL`` macro can be defined to turn those features on. Note 45that you will also need to link to the appropriate ``libc++experimental.a`` static 46archive. 47 48.. warning:: 49 Experimental libraries are Experimental. 50 * The contents of the ``<experimental/...>`` headers and the associated static 51 library will not remain compatible between versions. 52 * No guarantees of API or ABI stability are provided. 53 * When the standardized version of an experimental feature is implemented, 54 the experimental feature is removed two releases after the non-experimental 55 version has shipped. The full policy is explained :ref:`here <experimental features>`. 56 57 58Using libc++ when it is not the system default 59============================================== 60 61On systems where libc++ is provided but is not the default, Clang provides a flag 62called ``-stdlib=`` that can be used to decide which standard library is used. 63Using ``-stdlib=libc++`` will select libc++: 64 65.. code-block:: bash 66 67 $ clang++ -stdlib=libc++ test.cpp 68 69On systems where libc++ is the library in use by default such as macOS and FreeBSD, 70this flag is not required. 71 72 73.. _alternate libcxx: 74 75Using a custom built libc++ 76=========================== 77 78Most compilers provide a way to disable the default behavior for finding the 79standard library and to override it with custom paths. With Clang, this can 80be done with: 81 82.. code-block:: bash 83 84 $ clang++ -nostdinc++ -nostdlib++ \ 85 -isystem <install>/include/c++/v1 \ 86 -L <install>/lib \ 87 -Wl,-rpath,<install>/lib \ 88 -lc++ \ 89 test.cpp 90 91The option ``-Wl,-rpath,<install>/lib`` adds a runtime library search path, 92which causes the system's dynamic linker to look for libc++ in ``<install>/lib`` 93whenever the program is loaded. 94 95GCC does not support the ``-nostdlib++`` flag, so one must use ``-nodefaultlibs`` 96instead. Since that removes all the standard system libraries and not just libc++, 97the system libraries must be re-added manually. For example: 98 99.. code-block:: bash 100 101 $ g++ -nostdinc++ -nodefaultlibs \ 102 -isystem <install>/include/c++/v1 \ 103 -L <install>/lib \ 104 -Wl,-rpath,<install>/lib \ 105 -lc++ -lc++abi -lm -lc -lgcc_s -lgcc \ 106 test.cpp 107 108 109GDB Pretty printers for libc++ 110============================== 111 112GDB does not support pretty-printing of libc++ symbols by default. However, libc++ does 113provide pretty-printers itself. Those can be used as: 114 115.. code-block:: bash 116 117 $ gdb -ex "source <libcxx>/utils/gdb/libcxx/printers.py" \ 118 -ex "python register_libcxx_printer_loader()" \ 119 <args> 120 121 122.. _assertions-mode: 123 124Enabling the "safe libc++" mode 125=============================== 126 127Libc++ contains a number of assertions whose goal is to catch undefined behavior in the 128library, usually caused by precondition violations. Those assertions do not aim to be 129exhaustive -- instead they aim to provide a good balance between safety and performance. 130In particular, these assertions do not change the complexity of algorithms. However, they 131might, in some cases, interfere with compiler optimizations. 132 133By default, these assertions are turned off. Vendors can decide to turn them on while building 134the compiled library by defining ``LIBCXX_ENABLE_ASSERTIONS=ON`` at CMake configuration time. 135When ``LIBCXX_ENABLE_ASSERTIONS`` is used, the compiled library will be built with assertions 136enabled, **and** user code will be built with assertions enabled by default. If 137``LIBCXX_ENABLE_ASSERTIONS=OFF`` at CMake configure time, the compiled library will not contain 138assertions and the default when building user code will be to have assertions disabled. 139As a user, you can consult your vendor to know whether assertions are enabled by default. 140 141Furthermore, independently of any vendor-selected default, users can always control whether 142assertions are enabled in their code by defining ``_LIBCPP_ENABLE_ASSERTIONS=0|1`` before 143including any libc++ header (we recommend passing ``-D_LIBCPP_ENABLE_ASSERTIONS=X`` to the 144compiler). Note that if the compiled library was built by the vendor without assertions, 145functions compiled inside the static or shared library won't have assertions enabled even 146if the user defines ``_LIBCPP_ENABLE_ASSERTIONS=1`` (the same is true for the inverse case 147where the static or shared library was compiled **with** assertions but the user tries to 148disable them). However, most of the code in libc++ is in the headers, so the user-selected 149value for ``_LIBCPP_ENABLE_ASSERTIONS`` (if any) will usually be respected. 150 151When an assertion fails, an assertion handler function is called. The library provides a default 152assertion handler that prints an error message and calls ``std::abort()``. Note that this assertion 153handler is provided by the static or shared library, so it is only available when deploying to a 154platform where the compiled library is sufficiently recent. However, users can also override that 155assertion handler with their own, which can be useful to provide custom behavior, or when deploying 156to older platforms where the default assertion handler isn't available. 157 158Replacing the default assertion handler is done by defining the following function: 159 160.. code-block:: cpp 161 162 void __libcpp_assertion_handler(char const* file, int line, char const* expression, char const* message) 163 164This mechanism is similar to how one can replace the default definition of ``operator new`` 165and ``operator delete``. For example: 166 167.. code-block:: cpp 168 169 // In HelloWorldHandler.cpp 170 #include <version> // must include any libc++ header before defining the handler (C compatibility headers excluded) 171 172 void std::__libcpp_assertion_handler(char const* file, int line, char const* expression, char const* message) { 173 std::printf("Assertion %s failed at %s:%d, more info: %s", expression, file, line, message); 174 std::abort(); 175 } 176 177 // In HelloWorld.cpp 178 #include <vector> 179 180 int main() { 181 std::vector<int> v; 182 int& x = v[0]; // Your assertion handler will be called here if _LIBCPP_ENABLE_ASSERTIONS=1 183 } 184 185Also note that the assertion handler should usually not return. Since the assertions in libc++ 186catch undefined behavior, your code will proceed with undefined behavior if your assertion 187handler is called and does return. 188 189Furthermore, throwing an exception from the assertion handler is not recommended. Indeed, many 190functions in the library are ``noexcept``, and any exception thrown from the assertion handler 191will result in ``std::terminate`` being called. 192 193Back-deploying with a custom assertion handler 194---------------------------------------------- 195When deploying to an older platform that does not provide a default assertion handler, the 196compiler will diagnose the usage of ``std::__libcpp_assertion_handler`` with an error. This 197is done to avoid the load-time error that would otherwise happen if the code was being deployed 198on the older system. 199 200If you are providing a custom assertion handler, this error is effectively a false positive. 201To let the library know that you are providing a custom assertion handler in back-deployment 202scenarios, you must define the ``_LIBCPP_AVAILABILITY_CUSTOM_ASSERTION_HANDLER_PROVIDED`` macro, 203and the library will assume that you are providing your own definition. If no definition is 204provided and the code is back-deployed to the older platform, it will fail to load when the 205dynamic linker fails to find a definition for ``std::__libcpp_assertion_handler``, so you 206should only remove the guard rails if you really mean it! 207 208Libc++ Configuration Macros 209=========================== 210 211Libc++ provides a number of configuration macros which can be used to enable 212or disable extended libc++ behavior, including enabling "debug mode" or 213thread safety annotations. 214 215**_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS**: 216 This macro is used to enable -Wthread-safety annotations on libc++'s 217 ``std::mutex`` and ``std::lock_guard``. By default, these annotations are 218 disabled and must be manually enabled by the user. 219 220**_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS**: 221 This macro is used to disable all visibility annotations inside libc++. 222 Defining this macro and then building libc++ with hidden visibility gives a 223 build of libc++ which does not export any symbols, which can be useful when 224 building statically for inclusion into another library. 225 226**_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS**: 227 This macro disables the additional diagnostics generated by libc++ using the 228 `diagnose_if` attribute. These additional diagnostics include checks for: 229 230 * Giving `set`, `map`, `multiset`, `multimap` and their `unordered_` 231 counterparts a comparator which is not const callable. 232 * Giving an unordered associative container a hasher that is not const 233 callable. 234 235**_LIBCPP_NO_VCRUNTIME**: 236 Microsoft's C and C++ headers are fairly entangled, and some of their C++ 237 headers are fairly hard to avoid. In particular, `vcruntime_new.h` gets pulled 238 in from a lot of other headers and provides definitions which clash with 239 libc++ headers, such as `nothrow_t` (note that `nothrow_t` is a struct, so 240 there's no way for libc++ to provide a compatible definition, since you can't 241 have multiple definitions). 242 243 By default, libc++ solves this problem by deferring to Microsoft's vcruntime 244 headers where needed. However, it may be undesirable to depend on vcruntime 245 headers, since they may not always be available in cross-compilation setups, 246 or they may clash with other headers. The `_LIBCPP_NO_VCRUNTIME` macro 247 prevents libc++ from depending on vcruntime headers. Consequently, it also 248 prevents libc++ headers from being interoperable with vcruntime headers (from 249 the aforementioned clashes), so users of this macro are promising to not 250 attempt to combine libc++ headers with the problematic vcruntime headers. This 251 macro also currently prevents certain `operator new`/`operator delete` 252 replacement scenarios from working, e.g. replacing `operator new` and 253 expecting a non-replaced `operator new[]` to call the replaced `operator new`. 254 255**_LIBCPP_ENABLE_NODISCARD**: 256 Allow the library to add ``[[nodiscard]]`` attributes to entities not specified 257 as ``[[nodiscard]]`` by the current language dialect. This includes 258 backporting applications of ``[[nodiscard]]`` from newer dialects and 259 additional extended applications at the discretion of the library. All 260 additional applications of ``[[nodiscard]]`` are disabled by default. 261 See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for 262 more information. 263 264**_LIBCPP_DISABLE_NODISCARD_EXT**: 265 This macro prevents the library from applying ``[[nodiscard]]`` to entities 266 purely as an extension. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` 267 for more information. 268 269**_LIBCPP_DISABLE_DEPRECATION_WARNINGS**: 270 This macro disables warnings when using deprecated components. For example, 271 using `std::auto_ptr` when compiling in C++11 mode will normally trigger a 272 warning saying that `std::auto_ptr` is deprecated. If the macro is defined, 273 no warning will be emitted. By default, this macro is not defined. 274 275C++17 Specific Configuration Macros 276----------------------------------- 277**_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES**: 278 This macro is used to re-enable all the features removed in C++17. The effect 279 is equivalent to manually defining each macro listed below. 280 281**_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR**: 282 This macro is used to re-enable `auto_ptr`. 283 284**_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS**: 285 This macro is used to re-enable the `binder1st`, `binder2nd`, 286 `pointer_to_unary_function`, `pointer_to_binary_function`, `mem_fun_t`, 287 `mem_fun1_t`, `mem_fun_ref_t`, `mem_fun1_ref_t`, `const_mem_fun_t`, 288 `const_mem_fun1_t`, `const_mem_fun_ref_t`, and `const_mem_fun1_ref_t` 289 class templates, and the `bind1st`, `bind2nd`, `mem_fun`, `mem_fun_ref`, 290 and `ptr_fun` functions. 291 292**_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE**: 293 This macro is used to re-enable the `random_shuffle` algorithm. 294 295**_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS**: 296 This macro is used to re-enable `set_unexpected`, `get_unexpected`, and 297 `unexpected`. 298 299C++20 Specific Configuration Macros 300----------------------------------- 301**_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17**: 302 This macro can be used to disable diagnostics emitted from functions marked 303 ``[[nodiscard]]`` in dialects after C++17. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` 304 for more information. 305 306**_LIBCPP_ENABLE_CXX20_REMOVED_FEATURES**: 307 This macro is used to re-enable all the features removed in C++20. The effect 308 is equivalent to manually defining each macro listed below. 309 310**_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS**: 311 This macro is used to re-enable redundant members of `allocator<T>`, 312 including `pointer`, `reference`, `rebind`, `address`, `max_size`, 313 `construct`, `destroy`, and the two-argument overload of `allocate`. 314 315**_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION**: 316 This macro is used to re-enable the library-provided specializations of 317 `allocator<void>` and `allocator<const void>`. 318 Use it in conjunction with `_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS` 319 to ensure that removed members of `allocator<void>` can be accessed. 320 321**_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS**: 322 This macro is used to re-enable the `argument_type`, `result_type`, 323 `first_argument_type`, and `second_argument_type` members of class 324 templates such as `plus`, `logical_not`, `hash`, and `owner_less`. 325 326**_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS**: 327 This macro is used to re-enable `not1`, `not2`, `unary_negate`, 328 and `binary_negate`. 329 330**_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR**: 331 This macro is used to re-enable `raw_storage_iterator`. 332 333**_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS**: 334 This macro is used to re-enable `is_literal_type`, `is_literal_type_v`, 335 `result_of` and `result_of_t`. 336 337 338Libc++ Extensions 339================= 340 341This section documents various extensions provided by libc++, how they're 342provided, and any information regarding how to use them. 343 344.. _nodiscard extension: 345 346Extended applications of ``[[nodiscard]]`` 347------------------------------------------ 348 349The ``[[nodiscard]]`` attribute is intended to help users find bugs where 350function return values are ignored when they shouldn't be. After C++17 the 351C++ standard has started to declared such library functions as ``[[nodiscard]]``. 352However, this application is limited and applies only to dialects after C++17. 353Users who want help diagnosing misuses of STL functions may desire a more 354liberal application of ``[[nodiscard]]``. 355 356For this reason libc++ provides an extension that does just that! The 357extension must be enabled by defining ``_LIBCPP_ENABLE_NODISCARD``. The extended 358applications of ``[[nodiscard]]`` takes two forms: 359 3601. Backporting ``[[nodiscard]]`` to entities declared as such by the 361 standard in newer dialects, but not in the present one. 362 3632. Extended applications of ``[[nodiscard]]``, at the library's discretion, 364 applied to entities never declared as such by the standard. 365 366Users may also opt-out of additional applications ``[[nodiscard]]`` using 367additional macros. 368 369Applications of the first form, which backport ``[[nodiscard]]`` from a newer 370dialect, may be disabled using macros specific to the dialect in which it was 371added. For example, ``_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17``. 372 373Applications of the second form, which are pure extensions, may be disabled 374by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``. 375 376 377Entities declared with ``_LIBCPP_NODISCARD_EXT`` 378~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 379 380This section lists all extended applications of ``[[nodiscard]]`` to entities 381which no dialect declares as such (See the second form described above). 382 383* ``adjacent_find`` 384* ``all_of`` 385* ``any_of`` 386* ``binary_search`` 387* ``clamp`` 388* ``count_if`` 389* ``count`` 390* ``equal_range`` 391* ``equal`` 392* ``find_end`` 393* ``find_first_of`` 394* ``find_if_not`` 395* ``find_if`` 396* ``find`` 397* ``get_temporary_buffer`` 398* ``includes`` 399* ``is_heap_until`` 400* ``is_heap`` 401* ``is_partitioned`` 402* ``is_permutation`` 403* ``is_sorted_until`` 404* ``is_sorted`` 405* ``lexicographical_compare`` 406* ``lower_bound`` 407* ``max_element`` 408* ``max`` 409* ``min_element`` 410* ``min`` 411* ``minmax_element`` 412* ``minmax`` 413* ``mismatch`` 414* ``none_of`` 415* ``remove_if`` 416* ``remove`` 417* ``search_n`` 418* ``search`` 419* ``unique`` 420* ``upper_bound`` 421* ``lock_guard``'s constructors 422* ``as_const`` 423* ``bit_cast`` 424* ``forward`` 425* ``move`` 426* ``move_if_noexcept`` 427* ``identity::operator()`` 428* ``to_integer`` 429* ``to_underlying`` 430