Makros und alle anderen Direktiven mit dem Präfix #
werden vor der Kompilierung durch den Preprozessor verarbeitet. Sie generieren keinen Code, sondern erzeugen Quellcode, der dann vom Compiler verarbeitet wird, als hätten Sie den Code direkt eingegeben. So in Ihrem Beispiel des Code:
int main()
{
CALL_FUNCS(2) ;
}
Ergebnisse in dem generierten folgenden Quellcode:
int main()
{
do { \
func1(2);
func2(2);
func3(2);
} while (0) ;
}
So einfach ist das. Wenn Sie das Makro nie aufrufen, erzeugt es genau keinen Code. Wenn Sie es mehrmals aufrufen, wird Code mehrmals generiert. Es gibt nichts schlaues geht auf das Makro ist nur ein textueller Ersatz generiert vor Compilation; Was der Compiler damit macht, hängt vollständig davon ab, zu was das Makro expandiert und nicht, dass es ein Makro ist - der Compiler sieht nur den generierten Code, nicht die Makrodefinition.
In Bezug auf const vs #define, ein Literal-Konstante Makro ist auch jyst ein Ersatztext und wird in den Code als Literal-Konstante platziert werden. A const
auf der anderen Seite ist eine Variable. Der Compiler kann einfach eine Literalkonstante einfügen, in der weniger Code erzeugt wird, der die Konstante aus dem Speicher holt, in C++, die für einfache Typen garantiert ist, und es wäre für einen C-Compiler ungewöhnlich, sich nicht auf die gleiche Weise zu verhalten. Da es sich jedoch um eine Variable handelt, können Sie deren Adresse verwenden. Wenn Ihr Code die Adresse const
annimmt, muss der const
Speicherplatz haben. Ob der Speicher in RAM oder ROM ist, hängt von der Konfiguration des Compilers und des Linkers ab - Sie sollten die Dokumentation der Toolchain lesen, um zu erfahren, wie dieser Speicher gehandhabt wird.
Ein Vorteil der Verwendung eines const
ist, dass const-Variablen im Gegensatz zu Makros starke Typisierung und Umfang haben.
Makros beeinflussen die Laufzeit nicht, sie beeinflussen den Code vor der Kompilierung. –
Eine Frage pro Frage bitte. –
Wenn nicht verwendet, wird 'VARNULL' nicht gespeichert.Wenn Sie 'VARNULL' verwenden, sieht der Compiler den Code so, als ob Sie' (u8) 0' geschrieben hätten, und er wird diese Null sinnvoll verwenden. Mit 'CALL_FUNCS', wenn Sie es nicht verwenden, geht nichts in das Programm. Wenn Sie es aufrufen, werden an dieser Stelle im Code drei aufeinanderfolgende Funktionsaufrufe generiert, so als hätten Sie sie aus der Ferne geschrieben. Wenn Sie ein debugbares Image haben (wahrscheinlich nicht in einem eingebetteten System), dann erscheint eine 'const'-Variable in der Symboltabelle und kann das Debuggen erleichtern; Ein Makro wird nicht aufgezeichnet, daher ist es schwieriger zu debuggen. –