Makros werden nicht vom "tatsächlichen" C-Compiler verarbeitet. Makros werden von c-preprocessor verarbeitet, was lediglich ein Text-Ersetzungs-Mechanismus ist, so dass Ihr funktionsähnlicher Ausdruck, der als Makro definiert ist und als Funktion arbeiten soll, nicht zu einem normalen Funktionsverhalten führt.
Nach Vorverarbeitung stattfindet, wird Ihr Programm die folgende Struktur annehmen,
#include <stdio.h>
int main()
{
int m,n=7;
m = ((n==1)? (n) : (n*fctrl(n-1)));
printf("fctrl is %d\n",m);
return 0;
}
Die Frage sollten Sie sich fragen, wo ist fctrl Funktion definiert? Die Antwort ist offensichtlich, es ist nicht definiert und das ist der Hauptgrund, warum Sie undefined reference to 'fctrl'
Fehler erhalten.
Verwenden Sie cpp -nostdinc {filename}
oder gcc -E -nostdinc {filename}
Befehle am Terminal und Sie werden herausfinden, was vor sich geht. Übrigens, -nostdinc
wird verwendet, um die Aufnahme von System-Header-Dateien zu unterdrücken. cpp
ist das Programm zum Aufrufen von C/C++ - Präprozessor trotz der Tatsache, dass C/C++ - Präprozessor für Zwecke mehr als nur C/C++ Text-Ersatz-Mechanismus verwendet werden kann. gcc -E
Option gibt die gleichen Ergebnisse mit cpp
Befehl. In den frühen Tagen von Unix waren Präprozessor und Compiler getrennte Programme. Sie sind in den heutigen Betriebssystemen gebündelt.
Makros nicht rekurativ erweitern. –
Vielen Dank. @Stephan Lechner – Tree
Danke @ Lazcano – Tree