#define, #ifdef #undef #endif
-
05-07-2019 - |
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.
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 ifdef
s und else
s und so weiter in einer while
Schleife passieren.
#define
s 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
}