Skip to content

[BUG]: Compilation failure with MSVC 17.12 (v14.44) and C++20: '_BACKUP_ITERATOR_DEBUG_LEVEL' undeclared #5956

@loumalouomega

Description

@loumalouomega

Required prerequisites

What version (or hash if on master) of pybind11 are you using?

3.0.1

Problem description

This is a well-structured GitHub issue template you can use. It specifically targets the MSVC 17.12 incompatibility with the iterator debugging macros found in the Kratos core.


GitHub Issue Title:

Compilation failure with MSVC 17.12 (v14.44) and C++20: '_BACKUP_ITERATOR_DEBUG_LEVEL' undeclared


Description

When compiling Kratos Multiphysics, see KratosMultiphysics/Kratos#14105, with the last pybind11 release on Windows using Visual Studio 2022 version 17.12 (MSVC 14.44) with the std:c++20 flag, the build fails in several python binding files due to a macro conflict in the MSVC Standard Library headers.

The error appears to originate from the <span> header in the MSVC STL, which seems unable to resolve the custom _BACKUP_ITERATOR_DEBUG_LEVEL macro used by Kratos to manage iterator debugging states.

Environment

  • OS: Windows 10/11
  • Compiler: MSVC 14.44.35207 (Visual Studio 2022 17.12)
  • C++ Standard: C++20
  • Python version: 3.10.11
  • Build Type: Release

Error Log

C:\Program Files (x86)\...\include\span(179): error C2065: '_BACKUP_ITERATOR_DEBUG_LEVEL' : undeclared identifier
C:\Program Files (x86)\...\include\span(179): note: the template instantiation context (the oldest) is
C:\Program Files (x86)\...\include\span(31): note: during compilation of class template 'std::_Span_iterator'
C:\Program Files (x86)\...\include\span(179): error C3861: '_BACKUP_ITERATOR_DEBUG_LEVEL': identifier not found

Steps to Reproduce

  1. Use Visual Studio 2022 updated to version 17.12.
  2. Configure Kratos with CMake using -DCMAKE_CXX_STANDARD=20.
  3. Attempt to build the Kratos Core.

Potential Workaround

Adding in the header of <pybind11/pybind11.h>:

#if defined(_MSC_VER)
#ifndef _BACKUP_ITERATOR_DEBUG_LEVEL
#define _BACKUP_ITERATOR_DEBUG_LEVEL 0
#endif
#endif

Reproducible example code

(Sorry, but it is a full codebase, so I cannot isolate a snippet)

Is this a regression? Put the last known working version here if it is.

Not a regression

Metadata

Metadata

Assignees

No one assigned

    Labels

    triageNew bug, unverified

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions