Attualmente sto lavorando su un progetto di codice che richiede di sostituire certe stringhe con gli hash di quelle stringhe. Visto che queste stringhe non cambieranno in fase di esecuzione, sarebbe vantaggioso, in termini di efficienza, far sì che il preprocessore c esegua la mia funzione di hash su ogni stringa dichiarata come hash in fase di compilazione.Come far sì che il preprocessore C esegua il codice durante la compilazione?
C'è un modo per ottenere il preprocessore C per eseguire la mia funzione di hash in fase di compilazione?
So che questo non funziona come descritto sopra, ma solo per avere un'idea di dove sto andando, ecco alcuni pseudocodici che utilizzano una macro. Immaginate che invece di espandere la macro, il preprocessore ha la funzione di hash e ampliato per il valore di ritorno di quella funzione di hash:
#include <iostream>
#include <string>
#define U64_HASH(inputString) getU64HashCode(inputString)
//my hash function
unsigned long long getU64HashCode (string inputString)
{
/*code*/
}
int main()
{
cout << U64_HASH("thanks for helping me") << endl;
return 0;
}
Anche in questo caso, idealmente il cout << U64_HASH("thanks for helping me") << endl;
si espanderebbe a cout << 12223622566970860302 << endl;
ho scritto un generatore di file di intestazione, e questo funziona bene per questo progetto.
Soluzione Finale
ho deciso di utilizzare John Purdy's perl script per questo progetto, in quanto è semplicemente impressionante, e mi permette di alimentare l'uscita che voglio direttamente al mio compilatore. Grazie mille, John.
Non senza qualche magia pazzo. –
C++ 11 ha letterali definiti dall'utente e constexpr. Questi potrebbero essere utili. – Pubby
potresti sempre "# definire" quelle stringhe come i loro hash? AFAIK il preprocessore C non ha alcuna possibilità di eseguire codice. – Serdalis