以下面的宏为例:
#define _CREATE_VAR(X1) double X1{smc::define_variable (data, X1, #X1)};
#define _CREATE_VAR2(X1,X2) double X1{smc::define_variable (data, X1, #X1)}; /
double X2{smc::define_variable (data, X2, #X2)}; /
#define _CREATE_VAR3(X1,X2,X3) double X1{smc::define_variable (data, X1, #X1)}; /
double X2{smc::define_variable (data, X2, #X2)}; /
double X3{smc::define_variable (data, X3, #X3)}; /
#define _CREATE_VAR4(X1,X2,X3,X4) double X1{smc::define_variable (data, X1, #X1)}; /
double X2{smc::define_variable (data, X2, #X2)}; /
double X3{smc::define_variable (data, X3, #X3)}; /
double X4{smc::define_variable (data, X4, #X4)}; /
#define _CREATE_VAR5(X1,X2,X3,X4,X5) double X1{smc::define_variable (data, X1, #X1)}; /
double X2{smc::define_variable (data, X2, #X2)}; /
double X3{smc::define_variable (data, X3, #X3)}; /
double X4{smc::define_variable (data, X4, #X4)}; /
double X5{smc::define_variable (data, X5, #X5)}; /
有没有一种方法可以通过使用一个宏_CREATE_VAR
来简化这一过程,而不是使用具有不同变量参数和相应名称的多个实例?理想情况下,我希望自动调用相同的宏_CREATE_VAR
,无论有多少参数。
最佳答案
如果您不介意稍微不同的调用语法,您可以使用 boost.preprocessor为此:
#include "boost/preprocessor.hpp"
// or to not include entire preprocessor header, the following header files will do
// #include <boost/preprocessor/stringize.hpp>
// #include <boost/preprocessor/seq/for_each.hpp>
#define CREATE_ONE_VAR(maR_, maData_, maVarName) \
double maVarName {smc::define_variable (data, maVarName, BOOST_PP_STRINGIZE(maVarName))};
#define CREATE_VAR(maSeq) \
BOOST_PP_SEQ_FOR_EACH(CREATE_ONE_VAR, %%, maSeq)
使用示例:
CREATE_VAR((x1)(x2)(x3)) //does the same as your original _CREATE_VAR3(x1, x2, x3)
现在您可以使用从 1 到 BOOST_PP_LIMIT_SEQ
的任意数量的变量来调用它,通常为 256。
一些注意事项:
我使用 %%
来指示该参数未使用。您可以在其中放置任何内容(它会传递给内部宏的 maData
参数,我们不使用该参数)。
您不应将宏命名为以下划线开头,后跟大写字母。根据标准,这是非法的,因为此类符号(以及任何包含两个连续下划线的符号)是为编译器保留的。
关于C++ 和预处理器宏 : variadic type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15609533/