Incompatibility with resolv.h

Projects including an eigen3 header after including resolv.h directly or indirectly (eg. via httplib) will fail to compile because the _res define from resolv.h will apply to multiple argument names _res in eigen3 headers. For example compilation of

#include <resolv.h>
// #undef _res
#include <Eigen/Dense>

int main() { return 0; }

will lead to

In file included from /usr/include/eigen3/Eigen/Core:338,
                 from /usr/include/eigen3/Eigen/Dense:1,
                 from /work/main.cpp:3:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h:343:24: error: no declaration matches 'void Eigen::internal::product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false, ConjugateRhs, 0, ResInnerStride>::run(Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar** (*)(), Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  343 | EIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor,ResInnerStride>::run(
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h:331:33: note: candidate is: 'static void Eigen::internal::product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false, ConjugateRhs, 0, ResInnerStride>::run(Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar*, Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  331 |   static EIGEN_DONT_INLINE void run(
      |                                 ^~~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h:328:8: note: 'struct Eigen::internal::product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false, ConjugateRhs, 0, ResInnerStride>' defined here
  328 | struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor,ResInnerStride>
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h:438:24: error: no declaration matches 'void Eigen::internal::product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true, ConjugateRhs, 0, ResInnerStride>::run(Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar** (*)(), Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  438 | EIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor,ResInnerStride>::run(
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h:426:33: note: candidate is: 'static void Eigen::internal::product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true, ConjugateRhs, 0, ResInnerStride>::run(Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar*, Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  426 |   static EIGEN_DONT_INLINE void run(
      |                                 ^~~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h:423:8: note: 'struct Eigen::internal::product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true, ConjugateRhs, 0, ResInnerStride>' defined here
  423 | struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor,ResInnerStride>
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/eigen3/Eigen/Core:342:
/usr/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h:109:24: error: no declaration matches 'void Eigen::internal::product_triangular_matrix_matrix<Scalar, Index, Mode, true, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, 0, ResInnerStride, Version>::run(Index, Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar** (*)(), Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  109 | EIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,true,
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  110 |                                                         LhsStorageOrder,ConjugateLhs,
      |                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  111 |                                                         RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>::run(
      |                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h:97:33: note: candidate is: 'static void Eigen::internal::product_triangular_matrix_matrix<Scalar, Index, Mode, true, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, 0, ResInnerStride, Version>::run(Index, Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar*, Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
   97 |   static EIGEN_DONT_INLINE void run(
      |                                 ^~~
/usr/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h:85:8: note: 'struct Eigen::internal::product_triangular_matrix_matrix<Scalar, Index, Mode, true, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, 0, ResInnerStride, Version>' defined here
   85 | struct product_triangular_matrix_matrix<Scalar,Index,Mode,true,
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   86 |                                            LhsStorageOrder,ConjugateLhs,
      |                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   87 |                                            RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>
      |                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h:267:24: error: no declaration matches 'void Eigen::internal::product_triangular_matrix_matrix<Scalar, Index, Mode, false, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, 0, ResInnerStride, Version>::run(Index, Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar** (*)(), Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  267 | EIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,false,
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  268 |                                                         LhsStorageOrder,ConjugateLhs,
      |                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  269 |                                                         RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>::run(
      |                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h:255:33: note: candidate is: 'static void Eigen::internal::product_triangular_matrix_matrix<Scalar, Index, Mode, false, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, 0, ResInnerStride, Version>::run(Index, Index, Index, const Scalar*, Index, const Scalar*, Index, Scalar*, Index, Index, const Scalar&, Eigen::internal::level3_blocking<Scalar, Scalar>&)'
  255 |   static EIGEN_DONT_INLINE void run(
      |                                 ^~~
/usr/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h:244:8: note: 'struct Eigen::internal::product_triangular_matrix_matrix<Scalar, Index, Mode, false, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, 0, ResInnerStride, Version>' defined here
  244 | struct product_triangular_matrix_matrix<Scalar,Index,Mode,false,
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  245 |                                         LhsStorageOrder,ConjugateLhs,
      |                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  246 |                                         RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>
      |                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Related: https://github.com/yhirose/cpp-httplib/issues/1350

Please rename these function parameter names to not clash with glibc defines.

Edited by Tobias Preclik