Questa è solo una variante del metodo, come dato da @ Michał Górny (ho esaurito commento spazio lì) ...
è possibile creare un file del seguente modulo comprendono:
/* Automatically created file - do not edit or ugly dinosaur will eat you */
#ifndef PREFIX
# define RENAME(f)
#else
# define RENAME(f) PREFIX ## f
#endif
/* list all the function and variables you want to rename here in one place */
#define func_foo RENAME(func_foo)
#define func_bar RENAME(func_bar)
/* ... many more ... */
#undef RENAME
Almeno gcc
consente di specificare l'inclusione di un file di intestazione dalla riga di comando con l'opzione -include rename.h
(presupponendo che questo file sia chiamato rename.h
). Poiché si utilizzano le opzioni di sosia gcc
(-O3
e Os
), si presume che si usi gcc
nel resto di questa risposta. Altrimenti, se il tuo compilatore C è ragionevole, dovresti essere in grado di farlo in un modo simile.
È possibile creare facilmente due o anche tre versioni della tua libreria che possono essere collegati in allo stesso tempo, se si desidera, fornendo diverse opzioni per il compilatore C (qui attraverso CFLAGS
impostazione):
CFLAGS += -include rename.h -DPREFIX=fast_ -D_BUILD_FAST -O3 -DBENCHMARKING
CFLAGS += -include rename.h -DPREFIX=small_ -D_BUILD_SMALL -Os -DBENCHMARKING
CFLAGS += -D_BUILD_FAST -O2
Se i file di intestazione della libreria sembrano molto regolari e se si dichiarano le funzioni private della libreria static
, è facile estrarre le funzioni da tali file di intestazione da uno script fittizio utilizzando espressioni regolari molto semplici per generare automaticamente il file rename.h
. Questo è un obiettivo di costruzione naturale se si utilizza make
o qualcosa di simile. Anche tutte le variabili globali devono essere rinominate utilizzando lo stesso metodo per consentire l'uso simultaneo.
Ci sono tre punti principali con questa soluzione:
- Il business ridenominazione brutto può essere nascosta in un unico file, non è necessario modificare i file di origine effettivi - soprattutto non è necessario per il disordine i file sorgente ma possono tenerli puliti e facili da leggere.
- La ridenominazione può essere facilmente automatizzata, se si seguono alcuni semplici principi (le convenzioni di codifica seguite per i file di intestazione e i file di intestazione dichiarano tutte le variabili e le funzioni globali).
- Non c'è motivo di rendere più complicato il benchmark avendo bisogno di eseguire il programma di test più volte (questo è rilevante se si è pigri come me e non si piacciono le attività ripetitive con la stessa violenza che faccio - so che a molte persone non importa , è piuttosto una questione di preferenza).
Questa domanda è molto poco chiara. – Falmarri
Perché non creare semplicemente più versioni con varie opzioni attivate/disattivate e confrontate ciascuna di esse? –
Non è possibile combinare entrambe le funzioni in un singolo collegamento se sono denominate uguali (e non sono statiche). – mah