2016-04-29 24 views
-4
#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的情况下重写此代码?我怎样才能用C语言编写这些循环而不是使用#define?

+4

通过预处理器运行它并查看输出。 –

+0

你确实知道预处理器只需要 *就可以用宏的主体替换宏调用?现在试着去替换你自己。 –

+0

你究竟想在这里做什么?\ – SamGhatak

回答

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_xyloop_xloop_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_xloop_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; 
    } 
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扩展名的文件,这将是一个预处理输出,您可以在其中查看宏扩展如何完成。

1

宏在C代码中实际上是文本替换。所以你可以非常轻松地做到这一点。

更换

loop_xy 

其内容

loop_x loop_y 

,然后替换那些与它们的内容:

(int x = 0; x < w; x++) (int y = 0; y < h; y++) 

瞧。多数民众赞成你的编译器如果你编译这个。

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; 
} 
相关问题