Durante la revisione della base di codice di Visual C++ ho trovato una cosa strana seguente. Un assert run-time (che è controllare le condizioni e un'eccezione se la condizione è violata) è stato utilizzato in un caso in cui la condizione potrebbe essere valutata al momento della compilazione:Qualsiasi motivo per utilizzare una dichiarazione di runtime invece di asserire in fase di compilazione?
assert(sizeof(SomeType) == sizeof(SomeOtherType));
chiaramente il compilatore valuterà la condizione e sostituire il codice che effettivamente essere sia
assert(true);
che non fa nulla o
assert(false);
che genera un'eccezione ogni volta che il controllo passa attraverso quella linea.
IMO un'assert in fase di compilazione avrebbe dovuto essere utilizzati, invece, per i seguenti motivi:
- che esporrebbe la violazione condizioni in precedenza - in fase di compilazione - e
- che avrebbe lasciato più pulita (quindi più veloce e più piccolo) codice macchina emesso
Sembra che l'asserzione in fase di compilazione sia l'unica cosa giusta. C'è qualche ragione possibile per preferire una dichiarazione di rincorsa qui?
Mi sembra un WTF. – egrunin
'assert' di solito non lancia un'eccezione ma piuttosto interrompe il programma. –
Per ora non esiste alcuna dichiarazione standard in fase di compilazione. Questo fatto è piuttosto importante, specialmente nelle basi di codice meno recenti. –