C ++ ##宏不起作用

时间:2015-12-24 11:30:23

标签: c++ macros

带有##的宏会将两个元素连接在一起,例如,如果您使用#define sptember oct ## ober,则会获得october

所以我的问题是: 我有一个像#define getRegByPin(pin) set ## pin这样的宏,而不是我从1到19的宏,有些定义如下:#define set0 xxx#define set1 xxx等。

但是当我在代码中调用我的宏时 int p = getPinNo(pin); st(getRegByPin(p), p, to); getRegByPin(p)替换为setp而不是set0set13等。

我该怎么办?

求助!你太棒了! :)

1 个答案:

答案 0 :(得分:1)

C预处理器(和C ++刚刚继承它),只是文本替换。它对变量一无所知。所以给出了

#define getRegByPin(pin) set ## pin
const int p = 5;

getRegByPin(p);  // Will expand to setp, not set5

从语法上看,我认为set0set13是常量。他们有可以计算的价值吗?例如:

auto getRegByPin(int pin) { return set0+pin; }  // or (set0 << pin)

如果没有,您将需要一个可以索引的常量数组:

auto getRegByPin(int pin) {
    static const setType_t pins[16] = { set0, set1, set2 ... set15};
    return pins[pin];
}

如果它们不是常量,而是函数,那么你的数组就需要是一个函数指针数组。

更喜欢使用预处理器以外的功能。