如何使用宏通过索引访问f0、f1等序列命名变量?
用宏访问按序号命名变量的可行方案
首先得明确:直接用预处理器的标识符拼接(比如f##i)行不通,因为预处理器是编译前处理的,循环里的i是运行时才会变化的变量,预处理器没法把它替换成具体的数字,最终会把MACRO(i)展开成fi,这显然不是你要的变量名。
给你两个可行的方案:
方案一:借助数组(推荐)
先把所有变量放进一个数组,然后让宏直接访问数组对应索引的元素。代码如下:
#include <iostream> using namespace std; float f0 = 0.1; float f1 = 1.2; float f2 = 2.3; float f3 = 3.4; // 定义数组存储变量 float f_array[] = {f0, f1, f2, f3}; // 宏直接访问数组 #define MACRO(i) f_array[i] int main() { float sum = 0; for(int i = 0; i < 4; i++) sum += MACRO(i); cout << sum << endl; // 输出7.0 return 0; }
这个方法扩展性强,后续加变量只需要往数组里加元素、调整循环长度即可。
方案二:纯宏判断(扩展性差)
如果非要用纯宏实现,可以利用条件分支,但变量多了会非常繁琐:
#include <iostream> using namespace std; float f0 = 0.1; float f1 = 1.2; float f2 = 2.3; float f3 = 3.4; #define MACRO(i) \ (i == 0 ? f0 : \ i == 1 ? f1 : \ i == 2 ? f2 : \ i == 3 ? f3 : 0.0f) int main() { float sum = 0; for(int i = 0; i < 4; i++) sum += MACRO(i); cout << sum << endl; // 输出7.0 return 0; }
这种方法只适合变量数量极少的场景,变量多了宏会变得冗长难维护。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

