如何在C中编写这些循环而不是使用#define?

时间:2016-04-29 10:37:30

标签: c

#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的情况下重写此代码?

4 个答案:

答案 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;
}