C ++定义可变宏

时间:2013-11-14 14:45:08

标签: c++ macros c-preprocessor

是否有可能在C ++中创建变量,每次变量用于不同的值后都会扩展?

例如,我想要跟随

#define mytype [smth here]
void foo(mytype a,mytype b,mytype c)

将扩展为

void foo(mytype1 a,mytype2 b,mytype3 c)

void foo(mytype1 a,mytype11 b,mytype111 c)

4 个答案:

答案 0 :(得分:3)

以下是使用Boost.Preprocessor来实现函数参数的示例:

#include <boost/preprocessor/repetition/enum_binary_params.hpp>

void foo(BOOST_PP_ENUM_BINARY_PARAMS(3, mytype, p));

那将扩展到

void foo(mytype0 p0, mytype1 p1, mytype2 p2);

答案 1 :(得分:1)

你不能拥有一个可以改变扩展内容的宏,但是你可以将它扩展为不同的东西:

std::string foo()
{
    static int x;
    return std::string("myvar") + std::to_string(x++) + "\n";
}

#define myvar foo()

cout<<myvar;
cout<<myvar;

将打印出来

myvar1
myvar2

答案 2 :(得分:0)

如果它只在输出时增加,你可以定义一个覆盖operator<<的结构,例如:

struct myvarstruct {
  int i;
  myvarstruct() : i(1){}
} myvar;

ostream &operator << (ostream &o, myvarstruct &s) {
  return o << "myvar" << s.i++;
}

答案 3 :(得分:-1)

#define mytype [smth here]
#define TYPE(a, b) _TYPE(a, b)
#define _TYPE(a, b) a##b
void foo(TYPE(mytype, 1) a, TYPE(mytype, 2) b, TYPE(mytype, 3) c)