typedef macro & MatrixXcf of eigen
今天我在玩eigen,然后它的文档里有一个snippet ComplexEigenSolver_compute.cpp, 第一行有一个类型 MatrixXcf, 样例中使用了MatrixXcf::Random(4,4)这种方式生成矩阵,我想生成另一个指定的,于是想要查看源码的构造函数定义,然后就用了之前学会的方法
grep -R MatrixXcf *
结果搜出来的结果都是在test,bench,doc文件夹中,显然没有我需要的定义,但是我却可以正常编译,这让人有点不知所措,然后我删掉了.git上层文件夹中除了.git和EIGEN文件夹之外的所有文件,但是编译依然成功,于是我把它放到VSCode 中,用了查看定义这个功能结果真的出来了.在这里
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>, cf)
真是让人大跌眼镜,之后
#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \
EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \
EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \
EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \
EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \
EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
#define EIGEN_MAKE_TYPEDEFS(Size, SizeSuffix) \
/** \ingroup matrixtypedefs */ \
/** \brief \cpp11 */ \
template <typename Type> \
using Matrix##SizeSuffix = Matrix<Type, Size, Size>; \
/** \ingroup matrixtypedefs */ \
/** \brief \cpp11 */ \
template <typename Type> \
using Vector##SizeSuffix = Matrix<Type, Size, 1>; \
/** \ingroup matrixtypedefs */ \
/** \brief \cpp11 */ \
template <typename Type> \
using RowVector##SizeSuffix = Matrix<Type, 1, Size>;
看来下一次要搜索Matrix##了!
本文讲述了作者在使用Eigen库时遇到的一个问题,即在寻找MatrixXcf类型的构造函数定义过程中,通过grep命令未能在预期的位置找到,但编译仍然成功。经过一系列的查找和分析,作者发现定义隐藏在宏展开之中,最终在EIGEN_MAKE_TYPEDEFS_ALL_SIZES宏定义中找到了答案。这次经历提醒我们在搜索源码时需要考虑到宏展开和可能的别名定义。
576

被折叠的 条评论
为什么被折叠?



