Token für "=" ist nicht gültig in Präprozessor-Ausdrücke
Ich habe ein Programm:
#include <iostream>
#define _DEBUG = 1
using namespace std;
int main() {
#if (_DEBUG == 1)
cout << "hello : " <<endl;
#endif
return 0;
}
Erstellung dieser gibt die Fehlermeldung:
$ g++ a.cpp
a.cpp:7:7: error: token "=" is not valid in preprocessor expressions
$ g++ --version
g++ (MacPorts gcc46 4.6.3_8) 4.6.3
Dachte ich ==
ist die Gleichheit bedingte operator?
- Benutzen Sie keine Namen beginnen mit einem Unterstrich und einer weiteren Unterstrich oder einem Großbuchstaben; Sie sind reserviert für die Umsetzung zu tun, wie Sie wollen. Es bedeutet, dass Ihre Nutzung des
_DEBUG
kollidieren könnten mit etwas in der system-Header, und es wäre Ihr code fehlerhaft ist. Tatsächlich, Sie sind in der Regel am besten aus, nicht erstellen von Namen, die mit einem Unterstrich beginnen bei alle. - bisschen nit: die reservierten Bezeichner sind Namen, die beginnen mit einem Unterstrich gefolgt von einem Großbuchstaben und die Namen, die enthalten zwei aufeinanderfolgende Unterstriche. So zum Beispiel
A__B
vorbehalten ist, sowie__AB
. - Sie sind richtig, dass Namen, die mit doppelten Unterstrich auch vorbehalten in C++. Ich Neige dazu zu denken, dass Sie als eine separate Regel von "nicht-start-Bezeichner mit Unterstrich', nicht zuletzt, weil C nicht über die Doppel-Unterstrich Einschränkung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur ein Tippfehler, denke ich:
sollte
Mache ich die ganze Zeit!
Dieser erklärt
_DEBUG
als ein makro, das expandiert zu= 1
, so dass, wenn es erweitert wird, die in Ihren bedingten Ausdruck ein, erhalten Siedas ist eindeutig nicht eine gültige bedingten Ausdruck. Sie müssen entfernen Sie die
=
aus der makro-definition:Darüber hinaus für "flag" Makros wie diese, ist es normalerweise eine gute Idee, um zu testen, ob das makro definiert ist, nicht, was der Wert des Makros. Zum Beispiel,
Sollte es
Den compiler gehen Sie durch alle Ihre code und ersetzen Sie alle Instanzen von textToBeReplaced mit replacementText.
In deinem Fall wäre es
Auf einer anderen Anmerkung Ihr
solltekönnteBeachten Sie, wie die 1 nie kommt hier ins Spiel? das heißt, Sie können eigentlich nur
- und nicht setzen Sie ihn auf etwas
#define _DEBUG 2
, in welchem Fall die Prüfung für_DEBUG == 1
könnte richtig sein.