None of the previous. What you really want is to eliminate *ad nauseum* references to constants, whether they be named or bare:

 for_each_chess_square (row, col) {
 /*...*/
 }

If you're actually going to proliferate the constant by repeating such loops and whatnot, it's best to stick with `8`.

`8` is self-describing; it's not a macro that stands for something else.

You Ain't Never Gonna (TM) turn it into a 9x9 chess program and if you ever do, the proliferation of 8 will not be the major difficulty.

We can search a 150,000 line code base for the token 8, and classify which occurrences mean what in seconds.

Far more important is to modularize the code so that the chess knowledge is concentrated in as few places as possible. It's better to have one, two, maybe three chess-specific modules in which a literal 8 occurs, than thirty-seven modules laced with chess-specific responsibility, referring to 8 through a symbolic name.