Comment inclure une nouvelle ligne dans un C ++ macro ou comment utiliser les modèles de C pour faire la même chose?

StackOverflow https://stackoverflow.com/questions/1548017

Question

J'ai vu la question suivante: Comment générer une nouvelle ligne dans une macro cpp?

Permettez-moi de donner une brève exigence d'un besoin dans une nouvelle ligne C ++ préprocesseur. Je travaille sur le compilateur ARM RealView 3.1 sur un code qui utilise le code assembleur intégré avec le code C ++.

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, ##val];bl vThunk_##op;ldr lr, [sp,##val];bx lr; \
    } \
   void vThunk_##op(void*)

DEFINE_FUNCTION(void*, mov_lt, #0x04)
{
     // do some operation
}

La macro ci-dessus déclare une fonction de montage intégré qui exige avec force entre chaque nouvelle ligne déclarations dans le corps de la fonction.

Je pense que cela est parce que le texte dans le corps de la fonction est envoyé à l'aveuglette assembleur ARM par le compilateur ARM.

Pourquoi le préprocesseur C est encore aujourd'hui de ne pas soutenir les remplacements à plusieurs lignes? et aussi je ne peux pas utiliser # dans la chaîne de remplacement. par exemple, pour ce genre de réunion,

str lr, [sp, #0x04]

J'ai essayé beaucoup de méthodes et moyens, mais rien de vraiment fonctionné. assembleur / compilateur ARM est si fondamental qu'il n'y a pas d'API comme asm volatile dans GCC.

macro DEFINE_FUNCTION est utilisé à beaucoup d'endroits, ne peut donc pas ignorer aussi.

Alors, à la station finale réflexion sur les solutions suivantes:

  • Utilisation m4 préprocesseur au lieu de C ++ preprocesser
  • Utilisez C les modèles de réaliser en quelque sorte à cela et remplacer DEFINE_FUNCTION en utilisant grep / sed

Quelqu'un peut-il me donner des pointeurs ou des façons de faire les choses ci-dessus? Je ne peux pas utiliser un compilateur autre que le compilateur ARM RealView 3.1.

J'ai besoin de l'expansion comme ci-dessous avec la nouvelle ligne, DEFINE_FUNCTION(void*, mov_lt, #0x04) {},

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
  }
Était-ce utile?

La solution

J'ai résolu le problème ci-dessus en utilisant préprocesseur GNU m4 avec succès.

m4_define('DEFINE_FUNCTION','
     __asm rtype nt_$2(void*) {  
      str lr, [sp, $3];
      bl vThunk_$1;
      ldr lr, [sp,$3];
      bx lr;
    } 
   void vThunk_$2(void*)')

DEFINE_FUNCTION(void*, mov_lt, 0x04)
{
}

Prétraitement le code ci-dessus en utilisant m4 a résolu mon problème de l'exigence de retour à la ligne dans le code. Ran m4 -P comme un événement prebuild afin que le fichier source est traitée avant même stade C préprocesseur et la compilation entre en image.

Merci pour l'aide et désolé pour la confusion beaucoup. Mais il y a vraiment une bonne marge de macro pré-processeur dans les derniers compilateurs C ++.

Autres conseils

toutes les versions de gaz a un caractère différent de substitution de retour à la ligne par exemple. AVR a $ rechercher le caractère pour la version de gaz ARM

Votre exemple est extrêmement déroutant, mais ne serait pas ce travail?

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, val];\
      bl vThunk_##op;\
      ldr lr, [sp,val];\
      bx lr;\
    }\
   void vThunk_##op(void*)

et quand appelé comme

DEFINE_FUNCTION(void*, mov_lt, 0x04)  // notice no # here
{
     // do some operation
}

vous obtiendrez

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
 }

ce qui est exactement ce que vous demandez.

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