Attualmente sto pulendo una libreria C esistente per pubblicarla spudoratamente.Come verificare se un parametro è un'espressione costante integrale in una macro del preprocessore C?
Una macro di preprocessore NPOT
viene utilizzata per calcolare la potenza successiva successiva di due per una determinata espressione di costante integrale in fase di compilazione. La macro viene normalmente utilizzata nelle inizializzazioni dirette. Per tutti gli altri casi (ad esempio utilizzando parametri variabili), esiste una funzione inline con la stessa funzione.
Ma se l'utente passa una variabile, l'algoritmo si espande in un enorme pezzo di codice macchina. La mia domanda è: Cosa posso fare per impedire a un utente di passare qualsiasi cosa tranne un'espressione costante integrata alla mia macro?
#define NPOT(x) complex_algorithm(x)
const int c=10;
int main(void) {
int i=5;
foo = NPOT(5); // works, and does everything it should
foo = NPOT(c); // works also, but blows up the code extremely
foo = NPOT(i); // blows up the code also
}
Quello che ho già provato:
- Definire la macro
#define NPOT(x) complex_algorithm(x ## u)
. Funziona ancora e genera un errore del compilatore, anche se difficilmente utile, per i parametri variabili. A meno che non ci siano variabili come iu ... Sporco, pericoloso, non lo voglio. - La documentazione non ha funzionato per la maggior parte degli utenti.
Per moralizzare, ritengo che questa domanda sia un ottimo esempio del perché le macro siano incomprensibili. È una specie di droghe altamente addictive. Sai che sono cattivi e una volta che inizi con loro, non puoi uscire. Troverete di aver bisogno sempre di più di loro. Basta guardare tra le righe di ciò che è veramente richiesto qui: "Qualcuno sa una macro per correggere questa macro, che chiama una macro." – Lundin
Anche così non sono riuscito a trovare niente di male con una macro che chiama un'altra macro, non è questo il punto. Above * complex_algorithm * sta per qualsiasi cosa. Puoi avere una macro oltre alla funzione inline che ne consente l'uso nelle inizializzazioni dirette dando la possibilità di convalidare i parametri. – Lutz