MLib Reference Manual | ||||
---|---|---|---|---|
Top | Description |
#include <mlib.h> #define m_warning_disable_var (var) #define exprtostrn (expr) #define texttostrn (text) #define stringify (macro_or_string) #define M_STRSIZE_FROM_TYPE (type) #define iftrue #define iffalse #define iftrueexpr (expr) #define ifelse (expr, istr1, istr2) #define forinoffset (index, offset) #define fortooffset (index, offset) #define forsettooffset (index, offset, set) #define foroffsetto (index, offset) #define foroffsettolong (index, offset) #define ciclo (n, istructions) #define cicloindex (n, index, istructions) #define cicloindexm (n, index, istructions) #define mloop #define MGPID (pointer, id) #define m_return_if_reentry #define m_return_val_if_reentry (val)
Queste macros costituiscono un insieme di strumenti volti a semplificare blocchi di codice di uso comune o a esplicitare meglio alcuni comandi del C.
Si consiglia un uso attento di queste macro poichè sostituendo molti comandi, nascondono la logica delle linee e quindi portano facilmente a commettere errori non sempre evidenti agli occhi dei più inesperti.
Example 1. Using custom macros.
#include <mlib.h> #include <mlib/mprintf.h> int m_main ( argc, argv ) { m_main_init ( argc, argv ); // warning: unused variable MPublic buffer_check1; // NO warning unused variable MPublic buffer_check2 = NULL; m_warning_disable_var ( buffer_check2 ); // warning: ‘buffer_control’ is used uninitialized in this function MPrivate buffer_control; m_warning_disable_var ( buffer_control ); m_printf ( "\n| %s \n", exprtostrn ( 2 < 3 ) ); m_printf ( "\n| %s \n", exprtostrn ( (2 < 3) == (3 > 2) ) ); m_printf ( "\n| %s \n", texttostrn ( -Why?- ) ); m_printf ( "\n| -%s- \n", texttostrn ( Why? ) ); m_printf ( "\n| -%s- \n", texttostrn (Why?) ); #define TEXT Why? #define MACRO TEXT m_printf ( "\n| -%s- \n", texttostrn ( MACRO ) ); // this stamp: "MACRO" m_printf ( "\n| -%s- \n", stringify ( MACRO ) ); // this stamp: "Why?" #undef MACRO #undef TEXT m_printf ( "\n| (1 < 2) = %s \n", (1<2) iftrue "TRUE" iffalse "FALSE" ); m_printf ( "\n| (1 < 2) = %s \n", iftrueexpr (1<2) "TRUE" iffalse "FALSE" ); m_printf ( "\n| (1 < 2) = %s \n\n", ifelse ( (1<2), "TRUE", "FALSE" ) ); mint signed_index; fortooffset ( signed_index, 3 ) // 4 routine ( from 0 to 3 ) { m_printf ( " -> %d", signed_index ); } m_printf ( "\n\n" ); fortooffset ( signed_index, (-3) ) // 4 routine ( from 0 to 3 ) { m_printf ( " -> %d", signed_index ); } m_printf ( "\n\n" ); foroffsetto ( signed_index, 3 ) // 4 routine ( from 3 to 0 ) { m_printf ( " -> %d", signed_index ); } m_printf ( "\n\n" ); foroffsetto ( signed_index, (-3) ) // 4 routine ( from 3 to 0 ) { m_printf ( " -> %d", signed_index ); } m_printf ( "\n\n" ); return MCORRECT; }
#define m_warning_disable_var(var) var = var
stability
: Stable
Utilizzata per eliminare il warning in caso di non utilizzo di una variabile dichiarata.
Questa macro è utile nei casi in cui si voglia evitare dei warning dati dal compilatore, relativi alla dichiarazione di variabili non utilizzate.
Un utilizzo eccessivo di questa scappatoia può però rendere difficoltosa la ricerca di bug relativi a variabili non implementate.
Si consiglia di inserire questa macro, all'interno delle funzioni, dopo l'ultimo "return", in modo da evitare una inutile esecuzione di istruzioni.
|
una variabile |
#define exprtostrn(expr) #expr
stability
: Stable
Converte una espressione in una stringa.
|
una espressione |
#define texttostrn(text) #text
stability
: Stable
Converte un testo in una stringa.
|
un testo |
#define stringify(macro_or_string) texttostrn (macro_or_string)
stability
: Stable
Accepts a macro or a string and converts it into a string after preprocessor argument expansion.
|
a macro or a string |
#define M_STRSIZE_FROM_TYPE(type) stringify(type), sizeof ( type )
stability
: Unstable
Utilizzato in funzioni che richiedano come argomenti una stringa rappresentante un tipo di dato, e le dimensioni in byte del tipo.
|
un tipo di dato |
#define iftrue ?
stability
: Stable
Macro di comprensione, utilizzata come sostituto del segno grafico '?' dell'operatore condizionale '? :'
see also: iffalse
#define iffalse :
stability
: Stable
Macro di comprensione, utilizzata come sostituto del segno grafico ':' dell'operatore condizionale '? :'
see also: iftrue
#define iftrueexpr(expr) (expr) iftrue
stability
: Stable
Macro di comprensione, utilizzata come sostituto della prima sezione dell'operatore condizionale '? :'
see also: iftrue
|
una espressione |
#define ifelse(expr,istr1,istr2) iftrueexpr(expr) istr1 iffalse istr2
stability
: Unstable
Macro di comprensione, utilizzata come sostituto dell'operatore condizionale '? :' Valuta una espressione e ritorna le istruzioni appropriate.
see also: iftrue
#define forinoffset(index,offset)
stability
: Unstable
Macro di semplificazione.
Assegna alla variabile index
il valore 0, esegue un ciclo di
istruzioni fino a che index
non risulta maggiore di offset
.
index
viene aumentato di una unità per ciclo.
Differisce dalla macro cicloindex per la variabile di conteggio che in forinoffset
è pubblica e possiede visibilità al di fuori del ciclo.
La variabile index
deve essere stata dichiarata prima dell'utilizzo di forinoffset.
offset
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
una variabile numerica |
|
un valore numerico |
#define fortooffset(index,offset)
stability
: Unstable
Macro di semplificazione.
Assegna alla variabile index
il valore 0, esegue un ciclo di
istruzioni fino a che index
non risulta uguale o maggiore di offset
.
index
viene aumentato di una unità per ciclo.
Differisce dalla macro cicloindex per la variabile di conteggio che in fortooffset
è pubblica e possiede visibilità al di fuori del ciclo.
La variabile index
deve essere stata dichiarata prima dell'utilizzo di fortooffset.
offset
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
una variabile numerica |
|
un valore numerico |
#define forsettooffset(index,offset,set)
stability
: Unstable
Macro di semplificazione.
Assegna alla variabile index
il valore 0, esegue un ciclo di
istruzioni fino a che index
non risulta uguale o maggiore di offset
.
index
viene aumentato di set
unità per ciclo.
La variabile index
deve essere stata dichiarata prima dell'utilizzo di forsettooffset.
offset
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
una variabile numerica |
|
un valore numerico |
|
una operazione numerica |
#define foroffsetto(index,offset)
stability
: Unstable
Macro di semplificazione.
Assegna alla variabile index
il valore offset
, esegue un ciclo di
istruzioni fino a che index
non risulta minore di 0.
index
viene diminuito di una unità per ciclo.
La variabile index
deve essere del tipo mint o muint,
in quest'ultimo caso viene comunque valutata come se fosse
del tipo mint attraverso un casting.
Differisce dalla macro cicloindexm per la variabile di conteggio che in foroffsetto
è pubblica e possiede visibilità al di fuori del ciclo.
La variabile index
deve essere stata dichiarata prima dell'utilizzo di foroffsetto.
offset
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
una variabile numerica |
|
un valore numerico |
#define foroffsettolong(index,offset)
stability
: Unstable
Macro di semplificazione.
Assegna alla variabile index
il valore offset
, esegue un ciclo di
istruzioni fino a che index
non risulta minore di 0.
index
viene diminuito di una unità per ciclo.
La variabile index
deve essere del tipo mlong o mulong,
in quest'ultimo caso viene comunque valutata come se fosse
del tipo mlong attraverso un casting.
offset
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
una variabile numerica |
|
un valore numerico |
#define ciclo(n,istructions)
stability
: Unstable
Macro di semplificazione.
Esegue le istruzioni istructions
per n
volte.
Per effettuare il ciclo viene definita una variabile privata ___index,
si sconsiglia di utilizzare tale variabile per le proprie istruzioni
all'interno del ciclo per mantenere una buona portabilità del codice.
Nel caso fosse necessario utilizzare una variabile numerica contatore si consiglia l'utilizzo del comando 'for' o delle macros cicloindex, cicloindexm, fortooffset ,foroffsetto , foroffsettolong .
n
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
un valore numerico di tipo muint |
|
delle istruzioni |
Since 0.0.1
#define cicloindex(n,index,istructions)
stability
: Unstable
Macro di semplificazione.
Esegue le istruzioni istructions
per n
volte.
Per effettuare il ciclo viene definita una variabile privata dichiarata index
.
La variabile di conteggio mantiene una visibilità interna al ciclo
e una volta terminato questo, viene liberata.
La variabile index
viene inizializzata a 0 ed aumentata fino a ( n
- 1 ).
Differisce dalla macro fortooffset per la variabile di conteggio che in cicloindex è privata e non possiede visibilità al di fuori del ciclo.
n
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
un valore numerico di tipo muint |
|
nome per una variabile di tipo muint |
|
delle istruzioni |
Since 0.0.1
#define cicloindexm(n,index,istructions)
stability
: Unstable
Macro di semplificazione.
Esegue le istruzioni istructions
per n
volte.
Per effettuare il ciclo viene definita una variabile privata dichiarata index
.
La variabile di conteggio mantiene una visibilità interna al ciclo
e una volta terminato questo, viene liberata.
La variabile index
viene inizializzata a ( n
- 1 ) e diminuita fino a 0.
Differisce dalla macro foroffsetto per la variabile di conteggio che in cicloindex è privata e non possiede visibilità al di fuori del ciclo.
n
viene castato attraverso la macro ABS ottenendone il valore assoluto.
|
un valore numerico di tipo muint |
|
nome per una variabile di tipo muint |
|
delle istruzioni |
Since 0.0.1
#define MGPID(pointer,id) (pointer + id)
stability
: Stable
Macro di semplificazione.
ritorna l'indirizzo di memoria alla posizione id
.
|
indirizzo ad una locazione di memoria allocata valida |
|
identificativo di posizione |
#define m_return_if_reentry()
stability
: Unstable
Macro di semplificazione. Utilizzata all'interno di funzioni prive di valori di ritorno. Consente, se collocata come prima linea di codice, di evitare lo svolgersi di una funzione nel caso questa venga invocata più di una volta.
Example 5. Using m_return_if_reentry()
.
#include <mlib.h> #include <mlib/mprintf.h> void func_test ( void ) { m_return_if_reentry(); m_printf ( "inside!" ); return; } int m_main ( argc, argv ) { m_main_init ( argc, argv ); m_printf ( "\n func: " ); func_test (); // stamp m_printf ( "\n func: " ); func_test (); // return m_printf ( "\n func: " ); func_test (); // return return MCORRECT; }
Since 0.0.2
#define m_return_val_if_reentry(val)
stability
: Unstable
Macro di semplificazione. Utilizzata all'interno di funzioni aventi valori di ritorno. Consente, se collocata come prima linea di codice, di evitare lo svolgersi di una funzione nel caso questa venga invocata più di una volta.
Example 6. Using m_return_val_if_reentry()
.
#include <mlib.h> #include <mlib/mprintf.h> mchars func_test ( void ) { m_return_val_if_reentry ( NULL ); return "inside!"; } int m_main ( argc, argv ) { m_main_init ( argc, argv ); m_printf ( "\n func: %s ", func_test () ); // return text m_printf ( "\n func: %s ", func_test () ); // return null m_printf ( "\n func: %s ", func_test () ); // return null return MCORRECT; }
|
un valore di ritorno |
Since 0.0.2