constexpr上のマクロの一般的なユースケースは次のとおりです。
* ConstexprがC ++ 11で定義されているため、Pre C ++ 11コードとの互換性。
* boost.preprocessorなど、プリプロセッサを頻繁に使用するライブラリとの互換性
*さまざまな機能を有効または無効にするために、プリプロセッサの定義を必要とするライブラリ。
*ビルドオプションを許可する：Cmakeおよびその他のコンパイラを許可すると、プリプロセッサを設定できます。コードの外側に定義し、構築時に異なるオプションを許可します。代わりに、これらをConstexpr変数に設定するには、cmakeのconfigure_fileを追加する必要があり、他のビルドシステムでは利用できない場合があります。
*オペレーティングシステムに応じて異なるライブラリを含む。一部のC ++ライブラリはUNIXのみであり、Windowsでの作業に代わるものが必要です。constexprは関数と変数の値を設定するために使用されるため、これには使用できません。
*システムに応じて異なるタイプの設定：一部のアーキテクチャは、Charの代わりにWindowsやWChar、Ulong vs Ulonglongなど、さまざまなタイプでより頻繁に動作する場合があります。
Common use cases for macros over constexpr include:
* Compatibility with pre C++11 code, since constexpr was defined in C++11.
* Compatibility with libraries that make heavy use of the preprocessor, such as Boost.preprocessor
* Any library that requires preprocessor definitions to enable or disable different features.
* Allowing for build options: CMake and other compilers allow for setting preprocessor defines outside of the code, allowing for different options when building. Setting these to constexpr variables instead requires an additional .in configure_file in cmake to translate them, and may be unavailable for other build systems.
* Including different libraries depending on the operating system. Some C++ libraries are unix only, and require alternatives to work in windows. Since constexpr is used for setting the values of functions and variables, it can't be used for this.
* Setting different types depending on system: some architectures might work with different types more often, such as windows and wchar instead of char, or ulong vs ulonglong.