Verifique el tipo de cadena (por ejemplo, literal, matriz, puntero) pasada a una función [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Restrict pasó el parámetro a un literal de cadena 6 respuestas

Tengo una función, que toma una matriz de caracteres y su tamaño:

void store_string (const char *p, size_t size); // 'p' & 'size' stored in map

La función está envuelta por una macro como:

#define STORE_STRING(X) store_string(X, sizeof(X))

Mi problema es que de alguna manera quiero prohibir o informar al usuario que solo se debe pasar literal de cadena a esta función. Porque, si se almacena algún puntero o matriz local dentro del mapa, ¡entonces podrían salirse del alcance y crear un caos!

¿Hay alguna forma de tiempo de compilación (preferido) o al menos una forma de hacerlo en tiempo de ejecución?

Respuestas a la pregunta(3)

Su respuesta a la pregunta