È una buona pratica ridefinire le parole chiave non disponibili come macro?

6

È una buona pratica ridefinire le parole chiave non disponibili con i macro?

Uso GCC 4.8 in uno dei miei progetti che non è esattamente compatibile con lo standard C11. Almeno non nella misura di 4.9. Ma ci sono alcuni casi in cui mi piacerebbe usare il moderno static_assert per affermare staticamente qualche espressione in fase di compilazione che non è ancora supportata in GCC 4.8.

#if (__STDC_VERSION__ < 201112L) && !defined(__cplusplus) && !defined(static_assert)
#define static_assert(e, msg)       ((void)char[(e)? 1: -1])
#endif

Ho seguito lo standard C11 dove dice che non dovremmo usare parole chiave per qualsiasi altro scopo. È anche afferma che static_assert è una macro definita in assert.h . È stato un po 'di confusione interpretare. Per evitare qualsiasi problema di porting in futuro, l'ho fatto racchiudere all'interno di un controllo #if per assicurarmi che non fosse C11 prima di definire quella macro.

Quindi è una buona pratica ridefinire le parole chiave non disponibili come macro che offrono un comportamento simile?

Nota, per favore non suggerire di aggiornare il mio compilatore. Non è facile in un ambiente embedded.

    
posta Unmanned Player 20.06.2018 - 00:26
fonte

1 risposta

9

Se vuoi dire "vicino allo stesso" non "esattamente lo stesso", allora no, non è una buona pratica, poiché rischi di perdere il codice di un anno o decennio da quando il progetto si aggiorna per usare un C11 compilatore standard. "Near similar" significa che le cose si interrompono in modo confuso e difficile da tracciare, causando molti graffi alla testa per chiunque arrivi a possedere il progetto.

Molto meglio è implementare la macro in un modo che denoti chiaramente che sta implementando quel comportamento, ma con un nome diverso, ad esempio, come proj_static_assert . Questo continuerà a funzionare quando si arriva a C11, ma può essere facilmente sostituito con static_assert . Poiché la sostituzione è quindi intenzionale, è più probabile che verifichi il comportamento previsto nella macro, piuttosto che vedere improvvisamente comportamenti strani quando il compilatore viene aggiornato.

Penso che l'unico modo in cui potrebbe essere una buona idea è se copi deliberatamente il codice da un compilatore C11 compatibile nel tuo progetto, ma anche allora, è discutibile.

    
risposta data 20.06.2018 - 01:14
fonte

Leggi altre domande sui tag