带有##
的宏会将两个元素连接在一起,例如,如果您使用#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
而不是set0
或set13
等。
我该怎么办?
求助!你太棒了! :)
答案 0 :(得分:1)
C预处理器(和C ++刚刚继承它),只是文本替换。它对变量一无所知。所以给出了
#define getRegByPin(pin) set ## pin
const int p = 5;
getRegByPin(p); // Will expand to setp, not set5
从语法上看,我认为set0
到set13
是常量。他们有可以计算的价值吗?例如:
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];
}
如果它们不是常量,而是函数,那么你的数组就需要是一个函数指针数组。
更喜欢使用预处理器以外的功能。