Is it better to use #ifdef PLATFORM
or #if PLATFORM
when writing code that needs to be conditionalised according to OS, CPU architecture, etc.?
Chromium's codebase uses the former. For example, it uses #ifdef OS_WIN
or #if defined(OS_WIN)
, where OS_WIN
is #define
d on Windows (by build/build_config.h
) and undefined elsewhere.
In contrast, NaCl's codebase uses the latter. It uses #if NACL_WINDOWS
or if (NACL_WINDOWS)
, where NACL_WINDOWS
is always #define
d: as 1 on Windows and 0 elsewhere.
This latter approach has the benefit of catching some mistakes:
- If you mistype the macro name in
#if NACL_WINDOWS
, you can get a compiler warning.However, this only works if you enable GCC/Clang's
-Wundef
warning. Microsoft's compiler (MSVC) has a similar warning,/wd4668
, but it's effectively unusable because it produces warnings about system header files. - You can sometimes write
if (PLATFORM)
instead of#if PLATFORM
. Theif()
version has the advantage that the code in theif()
block will be compile-tested on all platforms, not just those wherePLATFORM == 1
. This can help catch mistakes earlier.This doesn't work if the code block uses functions that are only defined on
PLATFORM
, though.
See also: The Great -Wundef purge