Scrivere un #define per una dichiarazione comune

1

Spesso quando programmo in C scrivo l'espressione for (int i = 0; i < j; i++) .

Non ho mai scritto una macro o un'espressione define, ma potrei scrivere un #define per semplificare l'espressione sopra in modo che do i,j venga pre-elaborato a for (int i = 0; i < j; i++) ? Oppure, per qualche motivo, non è una buona idea?

    
posta Niklas Rosencrantz 18.06.2016 - 18:56
fonte

3 risposte

12

Non farlo.

Usare le macro per riconfigurare la lingua in questo modo è come scrivere in gergo. Uno o due esempi potrebbero non sembrare così male per qualcuno che deve leggerlo (incluso te stesso) ma ogni volta che lo fai lo rendi molto più probabile che l'effetto "bene cosa che significhi" avvenga . Stai oscurando inutilmente il tuo codice, aggiungendo uno strato di lavoro mentale necessario per scrivere / leggere / ragionare su di esso, e questo non è mai buono.

Inoltre, le macro definite tramite il meccanismo di pre-elaborazione possono essere permalose in termini di ciò che fanno , in un modo che può portare a bug che ti faranno strappare i capelli.

Ad esempio una macro che definisce 'forloop (i, j)' a qualcosa come 'for (int i = 0; i < j; i ++)' potrebbe tentarti di scrivere un giorno 'forloop (i, j ++) '. Cosa ti aspetteresti che j fosse dopo il ciclo?

Di solito ci sono dei modi per aggirare questo problema, ma a lungo termine è meglio e più semplice evitare semplicemente il problema.

    
risposta data 18.06.2016 - 19:20
fonte
3

Per rispondere alla tua domanda, sì, potresti scrivere una macro per realizzare il ciclo for . Tuttavia, questa non è una buona idea. Come ha fatto notare un altro utente, questo aggiunge difficoltà nel comprendere il programma.

Inoltre, ho visto di prima mano dove questo può diventare un problema. Una volta ho assistito a una situazione in cui un appaltatore utilizzava 4 o 5 livelli di macro uno sopra l'altro. Dopo aver completato il compito, abbiamo finito per scaricare tutto il codice e ripartire da zero piuttosto che tentare di riutilizzare il codice.

Se ritieni di voler solo scrivere codice in streaming che funzioni come "for-loops", crea una semplice funzione.

Ecco alcuni dei modi appropriati per usare le macro (se devi usare una macro):

La definizione dei file di intestazione (il metodo una volta solo). Spesso vorrete assicurarvi che il file di intestazione sia pre-elaborato una sola volta durante la compilazione, in modo che man mano che il vostro programma cresce non avrete errori di compilazione. Questo può essere fatto nel modo seguente (vedi più informazioni qui ):

#ifndef HEADER_FILE_H
#define HEADER_FILE_H

/* your header file code here */

#endif HEADER_FILE_H

Quindi, un altro modo corretto di utilizzare le macro è quando è necessario specificare un percorso di memoria che non si vuole rappresentare come esadecimale in tutto il programma. Ciò è particolarmente comune quando si scrive codice C di basso livello per microprocessori o microprocessori. Vuoi che i tuoi utenti vedano qualcosa come LED_PIN_ADDR , così altri sapranno che è l'indirizzo della posizione pin con il LED collegato. Può essere fatto nel modo seguente:

#define LED_PIN_ADDR 0x0123ABCD
    
risposta data 18.06.2016 - 20:16
fonte
1

Una delle migliori regole empiriche in tali situazioni è una famosa frase: "Il codice viene letto più spesso di quanto non sia scritto". Scriverà il codice una volta. Non è un grosso problema scrivere alcuni caratteri in più.

Quando si avvia l'uso di macro, la domanda dovrebbe essere "questo rende più facile la comprensione da parte del lettore". La risposta a questa domanda dipende molto dal lettore, ma in generale troverete che le macro riducono la leggibilità.

Le macro aumentano la leggibilità quando trasformano qualcosa di difficile da leggere in qualcosa di semplice da leggere. Per esempio, parte del codice con cui lavoro ha una macro CATCH_AND_HANDLE_TYPICAL_EXCEPTIONS che è un blocco di boilerplate di circa 20 righe che viene usato decine di volte. Per i nostri sviluppatori della nostra azienda, quella particolare macro migliora la leggibilità. Riduce la quantità di tempo che il lettore trascorre in sospeso durante il lavoro attraverso i dettagli della gestione delle eccezioni.

Scrivere macro leggibili è un'arte. Se sei nuovo a C, ti consiglio di evitare di scriverli per un po ', solo così puoi abituarti a ciò che gli altri trovano leggibile e illeggibile. Quindi, una volta che sei pronto, inizia imparando gli idiomi delle macro chiave come l'idioma do { ... } while(0) , il che rende una macro più simile a un'affermazione. È un processo di scansione, camminata, esecuzione.

Quindi, se decidi di imparare anche C ++, dai un'occhiata a Boost.Preprocessor. Ti mostrerà esattamente come sono le macro assurdamente potenti ... e perché non dovresti mai volgersi al lato oscuro e usarle come fanno in quella libreria =)

(Ho girato il lato oscuro di BOOST_PP due volte nella mia carriera: uno era un errore completo, l'altro ... non chiaro)

    
risposta data 19.06.2016 - 03:16
fonte

Leggi altre domande sui tag