2017-02-26 3 views
2

Ich schrieb diesen Code:Warum verwendet ein Makro in meinem Code einen Fehler und wie kann ich es beheben?

#include <stdio.h> 

#define fctrl(N) ((N==1)? (N) : (N*fctrl(N-1))) 

int main() 
{ 
    int m,n=7; 
    m = fctrl(n); 
    printf("fctrl is %d\n",m); 
    return 0; 
} 

Beim Kompilieren, bekam ich folgende Fehlermeldung:

/tmp/ccRODXnZ.o: In function `main': 
/home//Desktop/fctrl/fctrl.c:8: undefined reference to `fctrl' 
collect2: error: ld returned 1 exit status 

Warum wurde dieser Fehler angezeigt und wie kann ich es beheben?

+3

Makros nicht rekurativ erweitern. –

+0

Vielen Dank. @Stephan Lechner – Tree

+0

Danke @ Lazcano – Tree

Antwort

1

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.

+0

Vielen Dank für Ihre freundliche und detaillierte Erklärung! @nomadov – Tree

2

Sie versuchen, ein Makro zu definieren, das eine rekursive Funktion emuliert, aber Makros unterstützen keine Rekursivität, daher der Fehler.

Ich würde stattdessen eine Funktion verwenden, aber Sie lesen immer mehr in C preprocessor, recursive macros.

+1

Vielen Dank! @gsamaras – Tree

Verwandte Themen