使用Macro连接变量

时间:2014-09-20 08:21:25

标签: c

我在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的值连接起来。如果有人指导我,我会感激不尽。

2 个答案:

答案 0 :(得分:3)

宏和变量存在于完全不同的世界:它们无法读取变量的值。宏在预处理阶段进行了扩展,因此您的程序甚至还没有编译。他们只能对源代码进行纯粹的文本操作。

考虑将常量存储在静态数组中:

static const uint32 fn[2][2][3] = {
    {
        {0x011F, 0x0150, 0x0170},
        {0x0190, 0x01AF, 0x01EF}
    },
    /* ... */
};

然后,您可以使用var1var3作为索引直接访问它们:

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在预编译时处理,而不是在运行时。