Frage

Ich habe den folgenden Code

#define PROC_ADD

void main(void)
{
    while(1)
    {
#ifdef PROC_ADD
// Do this code here then undefined it to run the code in the else
// processing work
#undef PROC_ADD
#else
// now that PROC_ADD has been undefined run this code
// processing work
#endif
    }
}

Es ist jedoch für den Code ausführen. Aber es wird nicht den Code in den else laufen, nachdem der PROC_ADD hat nicht definiert worden ist.

Ich denke, der Grund könnte sein, dass Sie nur bei der Kompilierung definieren und undefine können und nicht zur Laufzeit. Aber ich bin nicht wirklich sicher.

War es hilfreich?

Lösung

Was Sie tun, ist das Build-Zeitäquivalent von:

int x = 1;

int main()
{
    if (x)
    {
        ...
        x = 0;
    }
    else
    {
        ...
    }
}

ifdef usw. zur Bauzeit passieren, aber für Ihr Beispiel, das ist kein Problem. Sobald Sie die if (entweder die Laufzeit oder bauen Zeitform), die Entscheidung über die Niederlassung bewerten nehmen es geschafft. Ändern etwas nach der Entscheidung, dass die Entscheidung nicht ändert, vorgenommen wurde.

Andere Tipps

Die ifdef Bedingung ausgewertet wird, wenn der Präprozessor wird es. Wenn Sie undef innerhalb des PROC_ADD'd Code ifdef hat der Prä-Prozessor bereits entschieden, welche Code-Abschnitt zu umfassen und welche zu ignorieren.

Darüber hinaus ja: ifdef, undef, etc. werden bei Vorbearbeitung Zeit verarbeitet - der Compiler nie sieht auch diese so genannten Richtlinien. Das bedeutet natürlich, Laufzeitcode auch nie diese Richtlinien sieht.

Bearbeiten : Der Präprozessor arbeitet mit einem einzigen Durchlauf durch die Textdatei nehmen. Der Präprozessor nicht einmal darauf, dass Ihre Textdatei C-Code enthält passiert! Es hat null Wissen, dass Ihre ifdefs und elses und so weiter in einer while Schleife passieren.

#defines nur während der Vorverarbeitung arbeiten. So

#define PROC_ADD 
void main(void) 
{
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
}

wird die folgende Art und Weise verarbeitet werden. Da PROC_ADDR definiert ist der Präprozessor vollständig #else Zweig ausschließen und dann #undef ausführen, so dass der #else Zweig Code überlebt nie Vorverarbeitung und erreicht nie den Compiler

In fast jedem Programmiersprache oder Syntax, sobald die Ausführung einen Zweig eines bedingten eingetreten ist (in diesem Fall der bedingten Wesen #ifdef, auch wenn die Zustandsänderungen während der Ausführung der Branche, werden andere Zweige nie ausgeführt werden.

Ich bin sicher, Sie würden nicht erwarten, drucken „Hallo“, würden Sie?

if (i == 1)
    i = 0;
else
    printf("Hello\n");

Im Grunde, was Sie sagen, ist, dass der Code unter dem else Zweig sollte immer ausgeführt wird, dann nehmen Sie es einfach aus einem Zweig, und legt sie direkt im Code .

Sowohl die Compiler und die Ausführung nur einen Durchgang durch conditionals machen, sobald ein Spiel sie nicht weiter zu suchen gefunden wurde.

So Sie den Code wollen durch den zweiten Kommentarbereich dargestellt immer laufen? Warum nicht einfach tun

#ifdef PROC_ADD
// Do the stuff to be done if PROC_ADD is defined
#undef PROC_ADD
#endif
// Do the stuff to always be done

Bearbeiten

OK - wenn Sie Laufzeit wollen Verhaltensänderungen müssen Sie Laufzeit Konstrukte (wie eine Variable dienen als Flag) verwenden. Wie wir alle sagen werden,. Nur einmal), Pre-Prozessor-Anweisungen ausgewertet, bei der Kompilierung werden

Denken auf diese Weise über sie: else Teil des folgenden Codes nicht einmal ausgeführt wird, obwohl x im false Abschnitt if gesetzt wurde.

Der Zustand in der if(x) Linie markiert ist selbst - wenn es diesen Block eintritt, ist es nicht jeder der nachfolgenden else Abschnitte neu zu berechnen -. Compiler hat bereits eine Entscheidung über die

bool x = true;
if(x)
{
  //do something
  x = false;
}
else
{
  //else code
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top