Come scrivere adeguatamente il parametro 'format' della funzione printf() in un codice C scritto con Gambas

Da Gambas-it.org - Wikipedia.

Come sappiamo, è possibile sfruttare in Gambas le risorse del linguaggio C:

  • creando un Componente Gambas contenente risorse di una libreria scritta in C;
  • richiamare direttamente nel progetto Gambas mediante la parola-chiave "Extern" le funzioni esterne di una libreria scritta in C.

Nel secondo caso detta libreria esterna in C potrà - ovviamente - essere anche scritta da noi. Segnatamente il codice sorgente di tale libreria esterna potrà essere scritto anche utilizzando gli strumenti e alcune risorse di Gambas.

Può accadere, scrivendo nell'IDE di Gambas il codice sorgente di una libreria esterna in C, che usando la funzione "printf()", la scrittura del suo primo parametro, lo specificatore di formato, causi problemi nella formattazione in Gambas e quindi nel risultato finale della scrittura del codice.

Facendo un esempio pratico, se proviamo a scrivere questa semplice nostra libreria esterna condivisa .so, nella formattazione Gambas avremo il problema evidenziato in giallo:

Private Extern scrive(i As Integer) In "/tmp/mialibreriaC"


Public Sub Main()
 
 Creaso()
 
 scrive(1234)
  
End


Private Procedure Creaso()
 
 File.Save("/tmp/mialibreriaC.c", "#include <stdio.h>\n\n" &
           "void scrive(int i) {\n" &
           "   printf(" % d ", i);\n}")
           
 Shell "gcc -o /tmp/mialibreriaC.so /tmp/mialibreriaC.c -shared" Wait
 
End

Come è facilmente visibile, all'interno del primo parametro della funzione esterna "printf( )", ossia la stringa che specifica il formato dell'espressione rappresentata dal secondo parametro, risultano essere presenti degli spazi che secondo il corretto protocollo non dovrebbero esserci.

Per ovviare al problema, dovremo porre un carattere della barra rovesciata \ (backslash) dinanzi a ciascun carattere interno delle doppie virgolette.
Quindi così:

"   printf(\"%d\", i);\n}")

Se, però, porremo all'interno del primo parametro ad esempio il carattere escape \n:

"   printf(\"%d\n\", i);\n}")

riceveremo un avviso in console, che sarà evitato ponendo un'ulteriore barra rovesciata dinanzi al carattere escape \n:

"   printf(\"%d\\n\", i);\n}")

Medesima soluzione sarà adottata nel caso siano presenti due o più specificatori di formato:

"   printf(\"%d %d\\n\", i, c);\n}")