Question

Je souhaite disposer d'un pré-pré-processeur C qui filtre certaines instructions #define du code source sans rien changer d'autre.

Pourquoi? Cela devrait être utilisé pour supprimer un code spécifique au client des sources si la source est transmise à un autre client.

Quelqu'un connaît-il une solution existante?

Merci! Simon

Était-ce utile?

La solution

Vous pouvez utiliser quelque chose comme awk au lieu du RPC? Ajoutez des drapeaux dans votre code entourant le code à supprimer. Par exemple:

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

puis écrivez un script awk pour supprimer ce code, quelque chose comme ...

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

Autres conseils

Cela ressemble à ce que j’ai demandé dans Existe-t-il un pré-processeur C qui élimine les blocs ifdef en fonction des valeurs définies . La meilleure réponse que j’ai obtenue est sunifdef , ou "Son of unifdef", qui a fonctionné de manière fiable pour moi sur du code conditionnel excessivement tordu (la charge accumulée depuis plus de 20 ans de développement sur une grande variété de plates-formes). avec une théorie inadéquate sur la façon de faire une compilation spécifique à une plate-forme).

Je ne pense pas que vous ayez besoin d’un pré-processeur pour cela. Si vous n'avez pas imbriqué #ifdef dans votre code, tout moteur regex peut supprimer tout ce qui se trouve entre #ifdef CLIENT et #endif (utilisez une correspondance non gourmande pour faire correspondre le premier #endif , pas le dernier).

Je mettrais le code spécifique au client dans un répertoire séparé ou éventuellement dans un projet différent qui aurait besoin d'être extrait du contrôle de code source.

Mettez un appel de fonction qui serait écrasé ou (j'oublie le terme approprié) vaguement lié pour qu'une autre fonction puisse être mise à sa place.

Je recommande l'utilisation d'une couche de langage macro supplémentaire pour le filtrage du code, telle que filepp . . Vous pouvez utiliser une syntaxe conviviale pour le préprocesseur C pour indiquer quelles parties appartiennent à quels clients.

//%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

Le préfixe '//%' vous permet de compiler le code sans modification. Vous pouvez exécuter filepp avant de donner le code à un client.

Si vous utilisez gcc, vous pouvez utiliser:

gcc <insert files here> -E

L'option -E indique à gcc de ne prétraiter que les sources et de ne pas les compiler.

Vous pouvez également utiliser grep pour filtrer des fichiers spécifiques et laisser le préprocesseur en vrac uniquement.

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

Vous pouvez également essayer unifdef , qui est un peu plus simple que sunifdef.

autant que je sache ... le préprocesseur peut être exécuté séparément (en utilisant les options correctives du compilateur). De cette façon, vous pouvez faire ce que vous voulez avec le code traité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top