我在Macro中有不同的地址。我需要选择任何地址取决于我的应用程序。这里的详细信息如下。
#define Location1_Subset1_Sub1 0x011F
#define Location1_Subset1_Sub2 0x0150
#define Location1_Subset1_Sub3 0x0170
#define Location1_Subset2_Sub1 0x0190
#define Location1_Subset2_Sub2 0x01AF
#define Location1_Subset2_Sub3 0x01EF
#define Location2_Subset1_Sub1 0x0211
#define Location2_Subset1_Sub2 0x0230
#define Location2_Subset1_Sub3 0x0240
#define Location2_Subset2_Sub1 0x027F
#define Location2_Subset2_Sub2 0x02A0
#define Location2_Subset2_Sub3 0x02EF
上述宏用于地址。
if(cond)
{
var1 = 1;
if(cond)
{
var2 = 2;
}
if(cond)
{
var3 = 1;
}
}
uint32 = Read_Address = fn(var1, var2, var3);
这是我的申请的一个例子。基于var1,var2和var3,宏应该选择相应的地址。根据上面的例子。它应该选择地址 Location1_Subset2_sub1 。
我需要定义一个宏,它将连接变量。我尝试使用下面的宏,这是不对的。
#define fn(var1,var2,var3) (Location##var1_Subset##var2_sub##var3)
字符串“Locationvar1_Subsetvar2_subvar3”是concat。但是我希望哪个会将var的值连接起来。如果有人指导我,我会感激不尽。
答案 0 :(得分:3)
宏和变量存在于完全不同的世界:它们无法读取变量的值。宏在预处理阶段进行了扩展,因此您的程序甚至还没有编译。他们只能对源代码进行纯粹的文本操作。
考虑将常量存储在静态数组中:
static const uint32 fn[2][2][3] = {
{
{0x011F, 0x0150, 0x0170},
{0x0190, 0x01AF, 0x01EF}
},
/* ... */
};
然后,您可以使用var1
到var3
作为索引直接访问它们:
uint32 Read_Address = fn[var1 - 1][var2 - 1][var3 - 1];
答案 1 :(得分:0)
使用此源代码来连接字符串。
#define fn(var1,var2,var3) (Location##var1##_Subset##var2##_sub##var3)
但是在你的程序中,你不能通过这种方式.Becase Macro在预编译时处理,而不是在运行时。