假设我有代码
void 1funct() {
(...)
}
void 2funct() {
(...)
}
etc., to
void nfunct() {
(...)
}
能否通过以下方式返回给定n的正确函数指针?
#define RET_FUNC_POINTER(n) (&nfunct);
?
是的--宏可以将源代码的字符用 ##
:
#define RET_FUNC_POINTER(n) (&n ## funct);
(标记是你的源代码中看不见的 "构件",是解析器在试图理解你的程序时从你的代码中生成的离散文本单位。它们大致类似于英语中的 "单词",但在C++中,它们不需要用空格隔开,除非省略一个空格就会产生一个单一的标记:例如 int main
vs intmain
但 int *
与 int*
. 随着 ##
我们可以把这两块令牌拿去。int
和 main
,并使用预处理程序将它们强制到 intmain
而不是。只是,你的一个参数是宏的 "变量"。注意,你不需要加入 &
和 n ## funct
部分,因为 &
已经是一个独立的标记,应该保持这种方式)。)
然而,你可能希望考虑用一个漂亮的指针数组来代替。
如果 n
是在编译时静态已知的(你的宏必须是这样的),那么你并没有真正获得任何东西,而只是写了 &1funct
, &2funct
等,而不是混淆你的代码(这并不是一个收益)。
另外注意,你的函数名不能以数字开头,你必须选择不同的命名方案。
不知道你为什么要这样做(而不是只用一个 const
数组),但用宏就很容易做到。
#define RET_FUNC_POINTER(n) (n##funct)