1

我写了以下代码:

#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 错误。

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

4

3 回答 3

5

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

于 2012-06-11T09:27:51.793 回答
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 宏的第一个参数的标题,以避免与同名变量混淆。希望这会有所帮助。

分享和享受。

于 2012-06-11T11:43:09.563 回答
1

在编译之前首先进行预处理,因此您的预期输出不会像上面 cnicutar 提到的那样出现。

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

于 2012-06-11T09:35:08.233 回答