PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C/C++ numbersign "#" im Präprozessor #define


Gast
2007-11-11, 13:50:10
Hallo,

Gibt es eine Möglichkeit ein numbersign # (Lattenzaun, Doppelkreuz etc.)
in einer Präprozessoranweisung zu maskieren? Oder einen anderen "Trick" wie man ein "#" nach einem #define platzieren kann?

Ich habe in etwa folgendes vor:


#define CLEAR_INTERRUPT_FLAG \
__asm \
rst 0, #ffaf \
__endasm;


Klar: das gibt in der 3. Zeile einen "'#' is not followed by a macro parameter"-oder-so-ähnlich Fehler, so dass ich das "#" vor ffaf irgendwie maskieren muss.

del_4901
2007-11-11, 14:00:22
Hallo,

Gibt es eine Möglichkeit ein numbersign # (Lattenzaun, Doppelkreuz etc.)
in einer Präprozessoranweisung zu maskieren? Oder einen anderen "Trick" wie man ein "#" nach einem #define platzieren kann?

Ich habe in etwa folgendes vor:


#define CLEAR_INTERRUPT_FLAG \
__asm \
rst 0, #ffaf \
__endasm;


Klar: das gibt in der 3. Zeile einen "'#' is not followed by a macro parameter"-oder-so-ähnlich Fehler, so dass ich das "#" vor ffaf irgendwie maskieren muss.
probier mal ## <- ich bin mir jetzt nach Codas Post nichtmehr sicher, ich glaube das war nur zum "verschmelzen"

Coda
2007-11-11, 14:00:53
Das Ding heißt "Raute".

Das Problem ist dass du den Code auch ohne Macro so nicht verwendet könntest.


__asm
rst 0, #ffaf
__endasm;
Würde genauso einen Fehler verursachen, weil du nicht mitten im Code eine Raute verwenden darfst.

Für welchen Compiler soll das denn sein? Schon mal einfach 0xffaf versucht?

Gast
2007-11-11, 14:27:51
Der Compiler ist der SDCC (http://sdcc.sourceforge.net/)
Der Assembler will das mit der Raute anscheinend so.
Wenn ich mir den generierten Code in den Assembler .asm-Dateien anschaue, dann steht vor allen generierten numerischen Angaben ein Rautenzeichen, also so

bla reg, #0x...

Der Code aus dem Quelltext wird direkt in die Ausgabe asm-Datei kopiert und verursacht genannten Fehler.
@AlphaTier: Jawohl, das ## ist zum konktatenierten zweier Parameter.

Coda
2007-11-11, 14:59:04
Ich nehmen an \# funktioniert auch nicht, oder?

Gast
2007-11-11, 15:19:37
Ich nehmen an \# funktioniert auch nicht, oder?
Leider nicht :-(
Selber Fehler.
Das "\" ist das Zeichen für Zeilenumbruch bei Präprozessoranweisungen und wird warscheinlich auch so interpretiert.

Coda
2007-11-11, 15:47:35
Dann würde ich vorschlagen du lässt das bleiben und benützt eine inline naked function anstatt dem Macro.

Gast
2007-11-11, 16:23:19
Dann würde ich vorschlagen du lässt das bleiben und benützt eine inline naked function anstatt dem Macro.

Hmm..., da hab ich auch schon dran gedacht, aber das wird glaub ich ein ganz schönes "Gehopse" wenn die Funktion in einer Schleife aufgerufen wird.
Deshalb ja das #define.


Interessant ist aber, das das "character escaping" in 10 Jahren C-ISO-Standard 89 anscheinend niemanden interessiert hat, sonst wäre es ja in den C99 bzw. in den C++Standard aufgenommen worden.
Das Problem trifft ja nicht nur für das Rautezeichen "#", sondern auch für den backslash "\" zu.

schade.

ScottManDeath
2007-11-11, 19:29:23
Warum nicht die Zahl dezimal angeben?

Coda
2007-11-11, 19:31:20
Hmm..., da hab ich auch schon dran gedacht, aber das wird glaub ich ein ganz schönes "Gehopse" wenn die Funktion in einer Schleife aufgerufen wird.
Deshalb ja das #define.
Deshalb ja inline. Da müsste man dann auch ohne Sprünge auskommen.

Interessant ist aber, das das "character escaping" in 10 Jahren C-ISO-Standard 89 anscheinend niemanden interessiert hat, sonst wäre es ja in den C99 bzw. in den C++Standard aufgenommen worden.
Das Problem trifft ja nicht nur für das Rautezeichen "#", sondern auch für den backslash "\" zu.
Das ist auch logisch, weil # nach C-Standard im Quelltext nach dem Preprocessing eigentlich nicht mehr vorkommen darf. Da wurde bei dem Inline-Assembler klar was übersehen.

Gast
2007-11-11, 21:26:53
Deshalb ja inline. Da müsste man dann auch ohne Sprünge auskommen.

Stimmt. Das würde dann ein #define simulieren.


Das ist auch logisch, weil # nach C-Standard im Quelltext nach dem Preprocessing eigentlich nicht mehr vorkommen darf. Da wurde bei dem Inline-Assembler klar was übersehen.

ich hab jetzt ein #pragma gefunden (#pragma preproc_asm -) das das preprocessing für inline assembler abschaltet.
Manuals lesen kann doch was bringen :-)

Trotzdem Vielen Dank an alle!