My suggestions:
1) change the value for alive or dead to 1 or 0. The printout can easily show a dot for 0, and 'X' for alive.
2) Delete the defines in red.
3) Instead of 'V1', etc., name your directions something you can intuitively associate with the 8 directions: maybe D1-D8, or D1, D3, ... D12. Indicating the approx. hour hand of the clock, (with you in the center), as it faces that direction.
Definitely, arrange your D's, so they work in order, from 12 or 1 o'clock to 10 or 12 o'clock, in a clockwise direction. Why clockwise? It's in ascending order, by hour. And I say so. ;)
4) I would prefer the D's was an array, rather than 8 different variables. Now you just count up the neighbors status, with a for loop:
for(i=0,alive=0;i<8;i++,D++) {
if(grid[D]])
alive++; //alive is an int
}
Unfortunately, I don't know a clever way to make D increment to E (and thus become a new direction in a define statement), in C. Defines don't handle that in compiled languages, AFAIK.
So you're left with 8 if statements:
if(grid[D1] alive++;
if(grid[D2] alive++;
//...
if(alive>2) //do something
Long involved defines are a witch to work with, down the road. Keep them short, direct, and clear.
Try to avoid being too clever. Whoever works on your program next, will have to be even more clever to extend or debug it, making it difficult indeed.