参考SO线程C Macro Token Concatenation involving a variable - is it possible?,
是否可以在C和C ++的编译时生成变量名?
类似
int count = 8;
for(i=0; i<count; i++) {
int var_%i% = i*i; // <--- magic here
}
我知道我可以在这种情况下使用数组,但这仅仅是为了解释我的意思。
答案 0 :(得分:8)
如果您希望使用i
的值来生成名称var_%i%
(例如生成变量var_1
,var_2
,. ..,var_count
),然后不,那根本不可能。首先,这甚至不是编译时操作。直到运行时才知道i
的值。是的,你可以告诉它将是什么(也许编译器可以在非常简单的情况下使用静态分析),但通常值只是运行时概念。
如果您只是想创建一个名为var_i
的变量,为什么不将其命名为?
如果你通过这样做解释了你试图解决的问题,也许会有所帮助。我保证有更好的方法去做。
答案 1 :(得分:1)
在C ++中,你可以通过模板实现这样的事情(但我不是专家,所以我不会再说了)。谷歌的“模板元编程”。但是,这不是基于变量(在运行时意义上)。
在C中,这不可能完成(当然,没有什么可以接近你的例子)。
答案 2 :(得分:1)
你可以使用宏来构建变量名,但是我还没有找到一个这样做的好主意。它不能像您的示例那样完成,因为i
没有预处理器可以解释的值。您只能使用已明确#defined的内容构建变量名称,因此“动态”变量名称的用处非常有限。
答案 3 :(得分:0)
首先,它无法完成,其次,你为什么要这样做?请记住,循环将由编译器看到并评估为某些汇编代码:
mov rcx, 0
_loop_label:
add rcx, 1
; do some stuff
cmp rcx, count
jl _loop_label
; continue program
然后数组访问看起来像这样(这是指针算术的工作原理):
mov rbx, [baseaddress+rcx*4]
免责声明:您的编译器肯定会编写比我更好的程序集。
因此,当您查看此内容时,您所做的只是通过迭代次数乘以相关数据类型的大小来访问内存地址偏移量。当你有足够的信息来获取有问题的内存地址时,在你的可执行文件中给它们提供一个唯一的,定义的名称有什么用呢?您当然不会在结果程序集中找到变量名称。
我怀疑如果您尝试做的事情是可能的,编译器只会优化它。