¿Usa el preprocesador de C para construir un literal de cadena para scanf?

Estoy intentando crear unsscanf literal de cadena para ayudar en la prevención de desbordamiento del búfer en C99. El objetivo es algo como:

#define MAX_ARG_LEN   16

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)

La solución "manual" obvia es algo así como:

#define MAX_ARG_LEN   16
#define MAX_ARG_CHARS "15"

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)

Sin embargo, preferiría que algo genere automáticamente "% 15X" dado un tamaño de búfer de 16. Este enlace escasi funciona para mi aplicación:Convertir un token de preprocesador en una cadena pero no maneja el -1.

Sugerencias?

Respuestas a la pregunta(1)

Su respuesta a la pregunta