Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Seltsames IFDEF Problem (https://www.delphipraxis.net/209643-seltsames-ifdef-problem.html)

TurboMagic 4. Jan 2022 11:10

Seltsames IFDEF Problem
 
Hallo,

gegeben Delphi 11.0 und dieser Code in einer Include Datei:

Delphi-Quellcode:
{$IFNDEF FPC}
  {$IFNDEF ASSEMBLER}
    {$DEFINE NO_ASM} (* default ON *)
  {$ELSE}
    {$IFDEF WINDOWS}
      {$DEFINE NO_ASM} (* default OFF *) // zu Testzwecken an
    {$ELSE
      {$DEFINE NO_ASM} (* default ON *)
    {$ENDIF}
  {$ENDIF}
{$ELSE}
  // Turn ASM off for FPC as we do not know enough about ASM support on FPC
  {$DEFINE NO_ASM} (* default ON *)
{$ENDIF}
Die Include Datei wird woanders eingebunden und wenn ich die Zeile mit
"zu Testzwecken an" so drin habe und dort, wo das eingebunden wird

Delphi-Quellcode:
{$IF Defined(NO_ASM)}
Bum!
{$IFEND}
zu Testzwecken einbinde wird Bum vom Compiler nicht wie gewünscht als falsch erkannt.
Kommentiere ich {$IFDEF WINDOWS} und das dazu gehörende Else aus, findet der Compiler
den Fehler.

Nur warum? Darf ich solche IFDEF/IFNDEF Konstrukte nicht so tief schachteln?

Grüße
TurboMagic

Uwe Raabe 4. Jan 2022 11:16

AW: Seltsames IFDEF Problem
 
Das ELSE in der Mitte hat keine schließende Klammer.

Rollo62 4. Jan 2022 12:40

AW: Seltsames IFDEF Problem
 
Nimm mal "MSWINDOWS", oder WIN32, WIN64 ...
https://docwiki.embarcadero.com/RADS...d_Conditionals

TurboMagic 4. Jan 2022 12:56

AW: Seltsames IFDEF Problem
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1500063)
Das ELSE in der Mitte hat keine schließende Klammer.

Duh! Genau das war es!
Mann, war ich blind...

himitsu 4. Jan 2022 14:30

AW: Seltsames IFDEF Problem
 
Ist das NO_ASM für "Assembler" oder für "InlineAssembler" gedacht?

In Win64 ist Assembler möglich, aber InlineAssembler gibt es leider nicht mehr,
also ganze Methode als Assembler = JA, aber kurzes Assembler-Stück innerhalb einer Pascal-Methode = NEIN.


Ich versuche persönlich von NOT-DEFINED Abstand zu halten, weil N da im IFNDEF zu leicht zu übersehen ist.
Delphi-Quellcode:
{$IFDEF FPC}
  // Turn ASM off for FPC as we do not know enough about ASM support on FPC
  {$DEFINE NO_ASM}
{$ELSE}
  {$IFDEF ASSEMBLER}
    {$IFDEF WINDOWS}
      {$UNDEF NO_ASM}
    {$ELSE}
      {$DEFINE NO_ASM}
    {$ENDIF}
  {$ELSE}
    {$DEFINE NO_ASM}
  {$ENDIF}
{$ENDIF}
Und mit OR/AND lässt sich so manches verschachteltes IFDEF-Monster vereinfachen und übersichtlicher gestalten.
Delphi-Quellcode:
{$IFDEF FPC}
  // Turn ASM off for FPC as we do not know enough about ASM support on FPC
  {$DEFINE NO_ASM}
{$ELSE}
  {$IF Defined(ASSEMBLER) and Defined(WIN32)}  //{$IF Defined(ASSEMBLER) or Defined(WINDOWS)}
    {$UNDEF NO_ASM}
  {$ELSE}
    {$DEFINE NO_ASM}
  {$IFEND}
{$ENDIF}
oder
Delphi-Quellcode:
{$DEFINE NO_ASM}
{$IFDEF FPC}
  // Turn ASM off for FPC as we do not know enough about ASM support on FPC
{$ELSE}
  {$IF Defined(ASSEMBLER) and Defined(WIN32)}  //{$IF Defined(ASSEMBLER) or Defined(WINDOWS)}
    {$UNDEF NO_ASM}
  {$IFEND}
{$ENDIF}
k.A. ob FPC auch "derartige" ConditionalDefines mit Defined() kennt, aber wenn, dann
Delphi-Quellcode:
// Turn ASM off for FPC as we do not know enough about ASM support on FPC
{$IF Defined(ASSEMBLER) and Defined(WIN32) and not Defined(FPC)} 
  {$UNDEF NO_ASM}
{$ELSE}
  {$DEFINE NO_ASM}
{$IFEND}

TurboMagic 4. Jan 2022 14:33

AW: Seltsames IFDEF Problem
 
Hallo,

da geht's um ASM generell.
Ist im Entwicklungszweig der DEC jetzt auch gefixt.

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz