Voglio scrivere una macro per scrivere una stringa, utilizzando l'ottimizzazione in fase di compilazione della conoscenza della lunghezza di una stringa letterale. Ma ho bisogno di rilevare l'uso improprio, usando i puntatori.Come distinguere la stringa costante da char * nella macro C
Ecco cosa intendo:
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 seconda chiamata, la dimensione sarà una sciocchezza (sizeof un puntatore).
Voglio produrre un errore in fase di compilazione se tento di utilizzare tx_string su qualcosa di diverso da una stringa letterale. Questo sta usando gcc; c'è qualche cosa gcc che posso usare per fare questo?
Modifica: lavoro con buffer di dati che possono contenere valori nulli o non essere terminati da null. VERO VERAMENTE che si impedisca di utilizzare i puntatori a questo scopo e di impedire l'utilizzo di runtime strlen()
.
Edit 2:
Ecco un esempio che causerebbe un problema. Inventerò un protocollo immaginario in cui devo dire a un microcontrollore a 16 bit un indirizzo usando il comando GO seguito da un indirizzo come 16-bit raw (due caratteri a 8 bit), e voglio passare dall'indirizzo 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"
}
Sono sicuro che ci deve essere una sorta di controllo integrato gcc per questo. Vedo i sorgenti del kernel di Linux usando trucchi di distinzione in fase di compilazione come questo molto .. ma non posso mettere le mani su uno specifico rapidamente.
Finora l'idea di "programmatore di Windows" sembra buona, ma un errore di compilazione più significativo sarebbe un vantaggio.
Questo sembra un vincitore! Aspetterò un attimo nel caso qualcuno faccia il test perfetto o qualcosa di simile. – blueshift