The Abseil C++ code is compiled using flags indicated within this guide. Our objective is to support as many warning flags as possible, to minimize the chance that your code will be impacted by flags that you may need in your development environment. However, given the plethora of possible compilation configurations, that is not always possible, and we’ve found some flags to be counter-productive.
This guide describes the warning flags we are using, per compiler. We do disable some flags to keep our code as noise-free as possible. Notes on flags that we do not support and have intentionally disabled are provided within this guide. Separately, some flags are also disabled within existing tests. In both cases, we will continue to work to reduce the number of flags we need to disable.
These flags (and flags sets) are defined in the Abseil code repository within the copts.py file.
At a high level, Abseil defines two sets of flags:
ABSL_DEFAULT_COPTSABSL_TEST_COPTSABSL_TEST_COPTS includes all flags within ABSL_DEFAULT_COPTS but
disables a number of them to avoid problems with certain tests. In general, you
should treat ABSL_DEFAULT_COPTS as the canonical list of Abseil compiler
flags. We hope to harmonize these flag sets in the future.
In practice, ABSL_DEFAULT_COPTS contains one of the following flag sets,
depending on the compiler it is invoked under:
ABSL_GCC_FLAGS for GNU gcc compilersABSL_LLVM_FLAGS for Clang compilersABSL_MSVC_FLAGS for Visual Studio/msvc compilersThese flag sets are documented below.
The ABSL_GCC_FLAGS set of compiler flags has the following characteristics:
-Wall and -Wextra. (Note that not “all”
flags are contained with the GCC all set.)-Wcast-qual-Wconversion-null-Wmissing-declarations-Woverlength-strings-Wpointer-arith-Wunused-local-typedefs-Wunused-result-Wvarargs-Wvla-Wwrite-strings-Wsign-compare because of the presence of signed and
unsigned integer comparisons in our codebase (mostly between Abseil and the
standard library).References:
Options to Request or Suppress Warnings
The ABSL_LLVM_FLAGS set of compiler flags is the most extensive set and
provides the most code analysis, which is why we recommend a Clang compiler.
The Clang compiler flag set has the following characteristics:
-Wall, -Wextra and -Weverything. (Note
that, like with GCC, not “all” flags are contained with the Clang all
set.)-Wconversion is disabled to turn off the overly-broad set of implicit
conversion warnings. Many (but not all) of these implicit conversion warnings
are later turned on.-Wno-double-promotion-Wno-float-conversion-Wno-old-style-cast-Wrange-loop-analysis is disabled because Clang’s implementation only
ignores actual POD types; turning this warning on would require even small
value types such as absl::string_view to be defined as const references
within a range loop.-Wglobal-constructors is disabled because some low-level initialization
abstractions (mostly internal) require them. In general, however, you should
avoid global constructors.-Wpadded and -Wpacked are disabled because these flags are typically
used as advisory warnings.-Wgcc-compat is disabled because we want to use Clang-specific features in
a Clang compilation branch and not get unnecessary warnings about GCC.-Wcomma and -Wextra-semi are disabled because they are still valid C++
code (and occur in cases of macro expansion).-Wformat-literal is disabled because some of our logging code passes their
literal arguments to helper functions as non-literal variables.-Wswitch-enums is disabled because it would break any users of existing
enums, if additional enum entries were added.References:
The ABSL_MSVC_FLAGS set of compiler flags is specific to MSVC/Visual Studio
and has the following characteristics:
\W3 flag. (See
Warning Levels)./wd4005 prevents warnings about macro redefinitions./wd4068 prevents warnings on unknown pragmas./wd4244 prevents warnings on implicit conversions./wd4267 prevents warnings on conversion from size_t to int./wd4800 prevents warnings on implicit conversion to type
bool./DNOMINMAX to prevent Windows overrides of std min/max functions./DWIN32_LEAN_AND_MEAN to reduce the amount of Windows-specific header
files./D_CRT_SECURE_NO_WARNINGS to prevent Windows from complaining about
standard C++ functions.References: