【发布时间】:2021-08-13 18:24:19
【问题描述】:
我有一个 C++ 程序,其中某种模式的代码块不断重复,我想知道是否可以使用 C++ MACROS 作为预处理器来自动生成此代码。更准确地说,我的代码块看起来像这样:
for(std::size_t i=0;i< lc_.size(); i++)
{
std::string str;
state::MsData lc = data->lc(i);
convert<data::ClassForLC>(lc.data(), str);
lc_[i] = data::ClassForLC(str);
}
然后我可能会有另一个看起来像这样的块:
for(std::size_t i=0;i< mmop_.size(); i++)
{
std::string str;
state::MvData mmop = data->mmop(i);
convert<data::ClassForMMOP>(mmop.data(), str);
mmop_[i] = data::ClassForMMOP(str);
}
如您所见,一般模式是这样的:
for(std::size_t i=0;i< X_.size(); i++)
{
std::string str;
Y X = data->X(i);
convert<Z>(X.data(), str);
X_[i] = Z(str);
}
我想知道是否可以定义一个宏 REPLACE(X,Y,Z) 将上面代码中的 X,Y,Z 替换为我作为参数传递的任何文本?注意:我使用 C++11。 谢谢
【问题讨论】:
-
这能回答你的问题吗? Multi line preprocessor macros
-
有可能 - 但不要这样做!这是维护的痛苦!
for(std::size_t i=0;i< lc_.size(); i++)的长度在循环中也不会改变,所以不要每次都抓取它 - 取决于集合.size()可能是一项昂贵的操作。 -
只是补充一下@John3136 所说的,调试变成了一场巨大的噩梦。相反,请考虑使用模板函数或传入一个函数来执行非泛型部分。
-
可以像这样概括代码,因此只需编写一次。函数模板是一种常见的解决方案。也可以使用宏编写代码,但您会冒着使用宏带来的所有痛苦的风险。
-
将重复代码放入函数或子程序的古老艺术发生了什么?与其创建宏,不如尝试在函数中定义代码,放入头文件并用“内联”标记。