Domanda

Voglio avere un pre-preprocessore C che sta filtrando alcune istruzioni #define dal codice sorgente senza cambiare nient'altro.

Perché? Questo dovrebbe essere usato per rimuovere un codice specifico del client dalle fonti se la fonte viene distribuita a un altro client.

Qualcuno conosce una soluzione esistente?

Grazie! Simon

È stato utile?

Soluzione

Puoi usare qualcosa come awk invece di CPP? Aggiungi alcuni flag nel codice che circondano il pezzo di codice da rimuovere. Ad esempio:

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

quindi scrivi uno script awk per rimuovere questo codice, qualcosa come ...

BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
    {
    if(write==1) print <*>;
    }

Altri suggerimenti

Sembra quello che ho chiesto in Esiste un pre-processore C che elimina i blocchi ifdef in base ai valori definiti . La migliore risposta che ho ricevuto è stata sunifdef , o 'Figlio di unifdef', che ha funzionato in modo affidabile per me su un codice condizionale eccessivamente contorto (il greggio accumulato da oltre 20 anni di sviluppo su un'ampia varietà di piattaforme con una teoria inadeguata su come eseguire la compilazione specifica per piattaforma).

Non credo che tu abbia bisogno di un preprocessore per questo. Se non hai nidificato #ifdef nel tuo codice, qualsiasi motore regex può rimuovere tutto ciò che si trova tra #ifdef CLIENT e #endif (usa la corrispondenza non avida per abbinare il primo #endif , non ultimo).

Vorrei inserire il codice specifico del client in una directory separata o eventualmente parte di un progetto diverso che dovrebbe essere estratto dal controllo del codice sorgente.

Metti una chiamata di funzione che verrebbe cancellata o (dimentico il termine corretto) liberamente collegata in modo che un'altra funzione possa essere messa al suo posto.

Consiglio di utilizzare un ulteriore livello di linguaggio macro per il filtro del codice, come filepp . È possibile utilizzare una sintassi compatibile con il preprocessore C per esprimere quali parti appartengono a quali client.

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

Il prefisso '//%' consente di compilare il codice non modificato. Puoi eseguire filepp prima di distribuire il codice a un client.

Se stai usando gcc, puoi usare:

gcc <insert files here> -E

L'opzione -E dice a gcc di preelaborare solo i sorgenti e non di compilarli.

In alternativa, è possibile utilizzare grep per filtrare file specifici e lasciar perdere il preprocessore solo su di essi.

grep -r '#define CLIENT_CODE' ./*.h 

Puoi anche provare unifdef che è piuttosto più semplice di sunifdef.

per quanto ne so ... il preprocessore può essere eseguito come un passaggio separato (usando le opzioni del compilatore corrette). In questo modo puoi fare quello che vuoi con il codice elaborato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top