Para algo relativamente complejo es mejor desarrollar una función. Ello porque en la macro seria muy difícil (tal vez mediante la macro "assert") validar los argumentos.
En todo caso si solo quieres agregar un sufijo a la cadena puedes utilizar algo mas o menos así:
#include <stdio.h>
#include <stdlib.h>
#define FOPEN(var, sufix) ((var) = fopen("asd" TO_STR(sufix) ".dat", "ab"))
#define TO_STR(str) #str
int main(void)
{
FILE *a;
FILE *b;
FOPEN(a, 1);
FOPEN(b, 2);
return EXIT_SUCCESS;
}
Como puedes observar el problema es que se deben utilizar literales como 1 o 2, no puedes utilizar una variable. De nuevo en un caso como ese lo mejor es una funcion.
Un saludo