#define loop_x for (int x = 0; x < w; x++)
#define loop_y for (int y = 0; y < h; y++)
#define loop_xy loop_x loop_y
void game(int w, int h)
{
unsigned univ[h][w];
loop_xy univ[y][x] = rand() < RAND_MAX;
}
如何在不使用#define的情况下重写此代码?
答案 0 :(得分:2)
所以你有:
#define loop_x for (int x = 0; x < w; x++)
#define loop_y for (int y = 0; y < h; y++)
#define loop_xy loop_x loop_y
void game(int w, int h)
{
unsigned univ[h][w];
loop_xy univ[y][x] = rand() < RAND_MAX;
}
首先将 loop_xy 解析为 loop_x loop_y :
#define loop_x for (int x = 0; x < w; x++)
#define loop_y for (int y = 0; y < h; y++)
#define loop_xy loop_x loop_y
void game(int w, int h)
{
unsigned univ[h][w];
loop_x loop_y univ[y][x] = rand() < RAND_MAX;
}
然后解析 loop_x 和 loop_y :
#define loop_x for (int x = 0; x < w; x++)
#define loop_y for (int y = 0; y < h; y++)
#define loop_xy loop_x loop_y
void game(int w, int h)
{
unsigned univ[h][w];
for (int x = 0; x < w; x++) for (int y = 0; y < h; y++) univ[y][x] = rand() < RAND_MAX;
}
答案 1 :(得分:1)
宏在C代码中实际上是文本替换。所以你可以非常轻松地做到这一点。
替换
loop_xy
及其内容
loop_x loop_y
然后将其替换为内容:
(int x = 0; x < w; x++) (int y = 0; y < h; y++)
瞧。这就是编译器编译时你的编译器所做的事情。
答案 2 :(得分:0)
只需展开宏:
void game(int w, int h)
{
unsigned univ[h][w];
for(int x = 0; x < w; x++) {
for(int y = 0; y < h; y++){
univ[y][x] = rand() < RAND_MAX;
}
}
}
如果使用-E选项编译.c文件,也可以看到预处理的输出。它将创建一个扩展名为.i的文件,它将是一个预处理的输出,您可以在其中查看宏扩展的完成方式。
答案 3 :(得分:0)
#define
只是一个搜索和替换预处理器命令,您需要做的就是将loop_xy替换为它所定义的内容。
void game(int w, int h){
unsigned univ[h][w];
for (int x = 0; x < w; x++)
for (int y = 0; y < h; y++)
univ[y][x] = rand() < RAND_MAX;
}