宏观替代

时间:2012-06-11 09:25:01

标签: c linux macros

我写了以下代码:

#define GATE(name, num)do{\
  name##list[num] = #name;\
}while(0)

char* name[] = {"hello", "world", "byebye"};

int i;
for(i = 0; i < 3; i++)
{
    GATE(name[i],0);
}

显然,我无法得到我想要的GATE(name[0],0)hellolist[0] = "hello"取代,但name[0]list[0] = "hello"会导致gcc错误。

我想知道如何使用宏制作我想要的东西?

3 个答案:

答案 0 :(得分:5)

不,这不可能。预处理器在编译器启动之前进行文本替换。因此预处理器实际上从未看到字符串“hello” - 因此它不能发出hellolist

答案 1 :(得分:2)

我认为你不能以你想要的方式做你想做的事。但是,通过修改宏我相信你可以得到你想要的。请尝试以下方法:

#define GATE(source_arr, source_index, list_index)do{\
  source_arr##list[list_index] = source_arr[source_index];\
  }while(0)    

char *name[] = {"hello", "world", "byebye"};

int i;

for(i = 0; i < 3; i++)
{
  GATE(name, i, 0);
}

请注意,这仍然不会将文字文本(例如“hello”)复制出源数组 - 而是简单地复制一个指针(我假设namelist是一个指针数组)。如果您需要“he​​llo”等不变,则可能需要修改name的延迟以包含const。另请注意,我将第一个参数的标题修改为GATE宏,以避免与同名变量混淆。希望这会有所帮助。

分享并享受。

答案 2 :(得分:1)

预处理在编译之前首先完成,因此您的预期输出将不会出现上面的cnicutar所提到的。

要了解到底发生了什么,您可以使用gcc中的“-E”选项和MSVC编译器的/ E选项运行文件,并查看预处理器输出。