Custom Macros

Custom Macros — Commonly-used macros.

Stability Level

Unstable, unless otherwise indicated

Synopsis

#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)

Description

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;
}

  


Details

m_warning_disable_var()

	#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.

var :

una variabile

exprtostrn()

    #define exprtostrn(expr)				#expr

stability: Stable

Converte una espressione in una stringa.

expr :

una espressione

texttostrn()

    #define texttostrn(text)				#text

stability: Stable

Converte un testo in una stringa.

text :

un testo

stringify()

    #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.

macro_or_string :

a macro or a string

M_STRSIZE_FROM_TYPE()

    #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.

type :

un tipo di dato

iftrue

    #define iftrue  ?

stability: Stable

Macro di comprensione, utilizzata come sostituto del segno grafico '?' dell'operatore condizionale '? :'

see also: iffalse


iffalse

    #define iffalse :

stability: Stable

Macro di comprensione, utilizzata come sostituto del segno grafico ':' dell'operatore condizionale '? :'

see also: iftrue


iftrueexpr()

    #define iftrueexpr(expr)    (expr) iftrue

stability: Stable

Macro di comprensione, utilizzata come sostituto della prima sezione dell'operatore condizionale '? :'

see also: iftrue

expr :

una espressione

ifelse()

    #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

expr :

una espressione

istr1 :

delle istruzioni

istr2 :

delle istruzioni

Returns :

istr1 se TRUE, istr2 se FALSE

forinoffset()

#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.

index :

una variabile numerica

offset :

un valore numerico

fortooffset()

#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.

index :

una variabile numerica

offset :

un valore numerico

forsettooffset()

#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.

index :

una variabile numerica

offset :

un valore numerico

set :

una operazione numerica

foroffsetto()

#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.

index :

una variabile numerica

offset :

un valore numerico

foroffsettolong()

#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.

index :

una variabile numerica

offset :

un valore numerico

ciclo()

#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.

Example 2. Using ciclo

    ciclo ( 5,
    {
        m_printf ( "\n Hello ... \n" );
    } );
  


n :

un valore numerico di tipo muint

istructions :

delle istruzioni

Since 0.0.1


cicloindex()

#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.

Example 3. Using cicloindex

    cicloindex ( 5,var,
    {
        m_printf ( "\n %u \n", var );
    } );
  


n :

un valore numerico di tipo muint

index :

nome per una variabile di tipo muint

istructions :

delle istruzioni

Since 0.0.1


cicloindexm()

#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.

Example 4. Using cicloindexm

    cicloindexm ( 5,var,
    {
        m_printf ( "\n %u \n", var );
    } );
  


n :

un valore numerico di tipo muint

index :

nome per una variabile di tipo muint

istructions :

delle istruzioni

Since 0.0.1


mloop

    #define mloop    while(1)

stability: Stable

Macro di semplificazione. Esegue un ciclo infinito.


MGPID()

    #define MGPID(pointer,id)       (pointer + id)

stability: Stable

Macro di semplificazione. ritorna l'indirizzo di memoria alla posizione id.

pointer :

indirizzo ad una locazione di memoria allocata valida

id :

identificativo di posizione

m_return_if_reentry

#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


m_return_val_if_reentry()

#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;
}

  


val :

un valore di ritorno

Since 0.0.2