Quiero escribir una macro para escribir una cadena, utilizando la optimización en tiempo de compilación de conocer la longitud de una cadena literal. Pero necesito detectar el uso incorrecto, usando punteros.Cómo distinguir cadena constante de char * en C macro
Esto es lo que quiero decir:
void transmit(const char *data, int length);
#define tx_string(x) transmit((x), sizeof(x) -1)
void func(char *badmsg) {
tx_string("GO"); // ok
tx_string(badmsg); // not OK
}
Con la segunda llamada, el tamaño será sin sentido (sizeof un puntero).
Quiero generar un error de tiempo de compilación si intento usar tx_string en cualquier cosa que no sea una cadena literal. Esto está usando gcc; ¿Hay algo de gcc que pueda usar para hacer esto?
Editar: Trabajo con almacenamientos intermedios de datos que pueden contener nulos o no ser terminados por nulos. REALMENTE quiero evitar el uso de punteros para esto y evitar el uso en tiempo de ejecución strlen()
.
Edición 2:
He aquí un ejemplo que podría causar un problema. Voy a inventar un protocolo imaginario donde tengo que decirle a un microcontrolador de 16 bits una dirección usando el comando GO seguido de una dirección como raw de 16 bits (dos caracteres de 8 bits), y quiero ir desde la dirección 0.
#define GOSEQ "GO\000\000"
void func(void) {
char *bad = GOSEQ;
tx_string(GOSEQ); // ok, sends 4 bytes: GO and two zero bytes
tx_string(bad); // bad, using runtime strlen sends two characters "GO"
}
Estoy seguro de que debe haber algún tipo de control integrado de gcc para esto. Veo mucho las fuentes del kernel de Linux usando trucos de distinción en tiempo de compilación como este ... pero no puedo echar mano de uno específico rápidamente.
Hasta ahora la idea del "programador de Windows" parece buena, pero un error de tiempo de compilación más significativo sería una ventaja.
¡Esto parece un ganador! Esperaré un poco en caso de que alguien presente la prueba integrada perfecta o algo así. – blueshift