Seite 1 von 1
[PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 27.07.2010 22:39
von Mok
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 27.07.2010 22:59
von ts-soft
Ich gehe mal davon aus, was auch logisch wäre, Compilerdirektiven haben Vorrang vor macro,
werden also nicht transportiert. Aufteilung in mehrere macros also nicht möglich.
Damit wären dann auch die meisten Fehlermeldungen erklärt.
Aber genaues sollte wohl besser freak sagen.
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 27.07.2010 23:17
von STARGÅTE
eben,
denn eigenlich sollte ja CompilerIf darüber entscheiden welches Macro benutzt wird:
Code: Alles auswählen
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Macro Test
Debug "Juppi"
EndMacro
CompilerElse
Macro Test
Debug "Och nöö"
EndMacro
CompilerEndIf
Test
ansonsten halt mit einem Trick arbeiten wie ich bei Macros in Macros:
Code: Alles auswählen
Macro __EndM__
EndM
EndMacro
Macro __acro__
acro
EndMacro
Macro FakeEndMacro
:__EndM__#__acro__
EndMacro
Macro BuildMacro(_Macro, _MacroLine)
Macro _Macro
_MacroLine
FakeEndMacro
EndMacro
BuildMacro(Add(x,y),x + y)
BuildMacro(Sub(x,y),x - y)
Debug Add(3,2)
Debug Sub(3,2)
Vllt kannst du dieses Beispiel auch bei dir verwenden, indem du die CompilerIfs und EndIfs erst von Macros zusammen bauen lässt.
Sodass sie vorher nicht auftauchen.
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 27.07.2010 23:27
von Thorium
Eigentlich wäre es logischer zuerst die Makros aufzulösen und dann die Compilerdirektiven, so könnten Compilerdirektiven in Makros stehen. Ich sehe dabei keinen Nachteil. Stargates Beispiel würde genauso funktionieren, wenn man anstatt 2 Makros nur eins macht und innerhalb per Compilerdirektiven verzweigt.
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 29.07.2010 00:39
von freak
Das Verhalten ist normal und kein Bug.
Es ist ganz simpel:
- Nach einem CompilerIf was false ergibt wird alles ignoriert bis zu einem CompilerElse oder CompilerEndIf
- Damit findet auch keine Expansion von Macros statt, weil der Code ja nicht compiliert wird
- Damit wird auch das Macro in dem CompilerEndIf steht nie expandiert
- ... und damit wird der CompilerIf-Block nie beendet
Code: Alles auswählen
Macro a()
CompilerIf 0 ; hat erst einen Einfluss wenn a() benutzt wird, nicht hier bei der Definition
EndMacro
Macro b()
CompilerEndIf ; hätte auch erst einen Einfluss wenn b() benutzt/expandiert wird, was aber nie passiert (siehe unten)
EndMacro
a() ; wird expandiert zu "CompilerIf 0", also befinden wir uns in einem Code-Block der ignoriert werden muss
; ...
b() ; b() wird nie expandiert, weil Code der ignoriert wird bis ein CompilerEndIf gefunden wurde
; Also enden wir hier ohne ein CompilerEndIf
> Eigentlich wäre es logischer zuerst die Makros aufzulösen und dann die Compilerdirektiven, so könnten Compilerdirektiven in Makros stehen.
Genau das trifft auch zu. Compilerdirektiven können in Macros stehen und Macroparameter als Argumente haben. Aber wenn man einen CompilerIf-Block in einem Macro anfängt muss man ihn auch dort beenden weil keine weiteren Macros expandiert werden bis der Block beendet wird. Ist eigentlich logisch.
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 29.07.2010 10:24
von STARGÅTE
jo klingt logisch.
danke für die Erklärung.
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Verfasst: 29.07.2010 18:33
von Nino
freak,
besten Dank für die gute Erklärung!

Ich hab' das Zusammenspiel von Makros und Compilerdirektiven jetzt zum 1. Mal verstanden.
Grüße, Nino