| // Copyright (c) 2016-2025 The Pybind Development Team. |
| // All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #pragma once |
| |
| // PLEASE DO NOT ADD ANY INCLUDES HERE |
| |
| // Define some generic pybind11 helper macros for warning management. |
| // |
| // Note that compiler-specific push/pop pairs are baked into the |
| // PYBIND11_NAMESPACE_BEGIN/PYBIND11_NAMESPACE_END pair of macros. Therefore manual |
| // PYBIND11_WARNING_PUSH/PYBIND11_WARNING_POP are usually only needed in `#include` sections. |
| // |
| // If you find you need to suppress a warning, please try to make the suppression as local as |
| // possible using these macros. Please also be sure to push/pop with the pybind11 macros. Please |
| // only use compiler specifics if you need to check specific versions, e.g. Apple Clang vs. vanilla |
| // Clang. |
| #if defined(_MSC_VER) |
| # define PYBIND11_COMPILER_MSVC |
| # define PYBIND11_PRAGMA(...) __pragma(__VA_ARGS__) |
| # define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(warning(push)) |
| # define PYBIND11_WARNING_POP PYBIND11_PRAGMA(warning(pop)) |
| #elif defined(__INTEL_COMPILER) |
| # define PYBIND11_COMPILER_INTEL |
| # define PYBIND11_PRAGMA(...) _Pragma(#__VA_ARGS__) |
| # define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(warning push) |
| # define PYBIND11_WARNING_POP PYBIND11_PRAGMA(warning pop) |
| #elif defined(__clang__) |
| # define PYBIND11_COMPILER_CLANG |
| # define PYBIND11_PRAGMA(...) _Pragma(#__VA_ARGS__) |
| # define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(clang diagnostic push) |
| # define PYBIND11_WARNING_POP PYBIND11_PRAGMA(clang diagnostic pop) |
| #elif defined(__GNUC__) |
| # define PYBIND11_COMPILER_GCC |
| # define PYBIND11_PRAGMA(...) _Pragma(#__VA_ARGS__) |
| # define PYBIND11_WARNING_PUSH PYBIND11_PRAGMA(GCC diagnostic push) |
| # define PYBIND11_WARNING_POP PYBIND11_PRAGMA(GCC diagnostic pop) |
| #endif |
| |
| #ifdef PYBIND11_COMPILER_MSVC |
| # define PYBIND11_WARNING_DISABLE_MSVC(name) PYBIND11_PRAGMA(warning(disable : name)) |
| #else |
| # define PYBIND11_WARNING_DISABLE_MSVC(name) |
| #endif |
| |
| #ifdef PYBIND11_COMPILER_CLANG |
| # define PYBIND11_WARNING_DISABLE_CLANG(name) PYBIND11_PRAGMA(clang diagnostic ignored name) |
| #else |
| # define PYBIND11_WARNING_DISABLE_CLANG(name) |
| #endif |
| |
| #ifdef PYBIND11_COMPILER_GCC |
| # define PYBIND11_WARNING_DISABLE_GCC(name) PYBIND11_PRAGMA(GCC diagnostic ignored name) |
| #else |
| # define PYBIND11_WARNING_DISABLE_GCC(name) |
| #endif |
| |
| #ifdef PYBIND11_COMPILER_INTEL |
| # define PYBIND11_WARNING_DISABLE_INTEL(name) PYBIND11_PRAGMA(warning disable name) |
| #else |
| # define PYBIND11_WARNING_DISABLE_INTEL(name) |
| #endif |
| |
| #define PYBIND11_NAMESPACE_BEGIN(name) \ |
| namespace name { \ |
| PYBIND11_WARNING_PUSH |
| |
| #define PYBIND11_NAMESPACE_END(name) \ |
| PYBIND11_WARNING_POP \ |
| } |
| |
| // Robust support for some features and loading modules compiled against different pybind versions |
| // requires forcing hidden visibility on pybind code, so we enforce this by setting the attribute |
| // on the main `pybind11` namespace. |
| #if !defined(PYBIND11_NAMESPACE) |
| # ifdef __GNUG__ |
| # define PYBIND11_NAMESPACE pybind11 __attribute__((visibility("hidden"))) |
| # else |
| # define PYBIND11_NAMESPACE pybind11 |
| # endif |
| #endif |