我写了以下代码:
#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错误。
我想知道如何使用宏制作我想要的东西?
答案 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是一个指针数组)。如果您需要“hello”等不变,则可能需要修改name
的延迟以包含const
。另请注意,我将第一个参数的标题修改为GATE宏,以避免与同名变量混淆。希望这会有所帮助。
分享并享受。
答案 2 :(得分:1)
预处理在编译之前首先完成,因此您的预期输出将不会出现上面的cnicutar所提到的。
要了解到底发生了什么,您可以使用gcc中的“-E”选项和MSVC编译器的/ E选项运行文件,并查看预处理器输出。