Wie eine neue Zeile in einem C ++ enthält Makro oder wie C ++ Vorlagen verwenden, um das gleiche zu tun?

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

Frage

sah ich die folgende Frage: Wie eine neue Zeile in einem CPP-Makro generieren?

Lassen Sie mich eine kurze Anforderung eines Bedürfnisses in Newline in einem C ++ Präprozessor geben. Ist auf ARM Realview-Compiler 3.1 auf einem Code, die ++ Code Assembler-Code mit C eingebettet verwendet.

#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
}

Der obige Makro deklariert eine eingebettete Montage-Funktion, die zwischen den einzelnen Anweisungen im Funktionskörper erfordert gewaltsam Newline.

Ich denke, das liegt daran, dass der Text in der Funktion Körper blind ARM-Assembler von ARM Compiler gesendet.

Warum C ++ Präprozessor ist jetzt noch nicht mehrzeiligen Ersatz zu unterstützen? und auch ich kann nicht # in der Ersatzzeichenfolge verwenden. zum Beispiel für diese Art von Montage,

str lr, [sp, #0x04]

Ich habe versucht, viele Methoden und Wege, aber nichts funktionierte wirklich heraus. ARM-Assembler / Compiler ist so grundlegend, dass es keine API wie asm volatile in GCC.

DEFINE_FUNCTION Makro an vielen Orten verwendet wird, so es nicht auch ignorieren kann.

Also, bei letztem Mittel Nachdenken über die folgenden Lösungen:

  • Verwenden von m4 Präprozessor anstelle von C ++ preprocesser
  • Verwenden von C ++ Vorlagen irgendwie dieses Ziel zu erreichen und ersetzen DEFINE_FUNCTION mit grep / sed

Kann jemand geben Sie mir Hinweise oder Möglichkeiten, um die oben genannten Dinge zu tun? Ich kann keinen Compiler andere als ARM Realview-Compiler 3.1.

Ich brauche eine Expansion wie unten mit neuer Linie für, 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
  }
War es hilfreich?

Lösung

löste ich das oben genannte Problem mit GNU m4 Präprozessor erfolgreich.

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)
{
}

Vorverarbeitung des obigen Code m4 mit meinem Problem gelöst von Newline Anforderung im Code. Ran m4 -P als vorkompilierte Ereignis, so dass die Quelldatei verarbeitet wird, noch bevor C-Präprozessor und Kompilierungsphase kommt ins Bild.

Danke für die Hilfe und sorry für viele verwirrend. Aber es ist wirklich ein Rahmen für eine gute Makro Pre-Prozessor in neueste C ++ Compiler.

Andere Tipps

jede Gasversion hat verschiedene Newline Ersetzungszeichen z.B. AVR hat $ suchen Sie nach dem Zeichen für ARM Gas Version

Ihr Beispiel extrem verwirrend, aber wäre diese Arbeit nicht?

#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*)

und wenn sie aufgerufen wie

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

Sie würden erhalten

__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
 }

das ist genau das, was Sie fordern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top