[PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
- Mok
- BotHunter
- Beiträge: 1484
- Registriert: 26.12.2005 14:14
- Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit - Wohnort:
[PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Siehe hier. PB4.50 Win32
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
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.
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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
eben,
denn eigenlich sollte ja CompilerIf darüber entscheiden welches Macro benutzt wird:
ansonsten halt mit einem Trick arbeiten wie ich bei Macros in Macros:
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.
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
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)
Sodass sie vorher nicht auftauchen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
Das Verhalten ist normal und kein Bug.
Es ist ganz simpel:
> 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.
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
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
jo klingt logisch.
danke für die Erklärung.
danke für die Erklärung.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: [PB4.5Win32]Fehler bei Compiler-Direktiven in Macros
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
besten Dank für die gute Erklärung!

Ich hab' das Zusammenspiel von Makros und Compilerdirektiven jetzt zum 1. Mal verstanden.

Grüße, Nino