2016-04-18 7 views
0

Ich weiß, dass mein Verständnis von #include oder wie es kompiliert wird, nicht korrekt ist, sonst würde der Code, den ich habe, funktionieren. Ich bin verwirrt, warum mein Code an zwei Stellen #include benötigt, um korrekt zu kompilieren und zu laufen.#include stdio Verwirrung ist es für jede Header-Datei benötigt?

Meine Haupt CPP-Datei armperfmon.cpp:

#include "armperfmon.h" 
int main(int argc, char* argv[]) 
{ 
    FILE* pOutFile = NULL; 
    PrintCounterOptions(pOutFile); 
} 

Haupt-Header-Datei armperfmon.h:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include "counters.h" 

void PrintCounterOptions(FILE* pFile); 

an zweiter Stelle cpp enthält Funktion counters.cpp:

void PrintCounterOptions(FILE* pFile) 
{ 
    fprintf("print some stuff"); 
} 

zweiten Kopf Datei für Funktionszähler.h

void PrintCounterOptions(FILE* pFile); 

Der Fehler:

counters.cpp: error: 'FILE' was not declared in this scope 
counters.cpp: error: 'pFile' was not declared in this scope 

wenn ich #include <stdio.h> in der Funktion CPP-Datei und geben Sie dann die Fehler weggeht und die Funktion kompiliert/ausführt, wie erwartet. Ich nahm an, dass in der main.h-Datei, wenn es <stdio.h> enthielt, es für nachfolgende FILE * -Definitionen verfügbar wäre, besonders weil es vor counters.h enthalten ist. Wenn ich dies tippe, merke ich auch, dass das korrektere Include <cstdio> ist. Wenn jemand klären könnte, was mit meinem Denkprozess nicht stimmt, würde es sehr geschätzt werden.

Antwort

1

Es ist schwer, dies genau zu beantworten, weil Sie alle spezifischen Details wie Dateinamen entfernt haben, aber kurz gesagt, C++ - Quelldateien werden unabhängig voneinander kompiliert, bevor die Ergebnisse miteinander verknüpft werden und der "Hauptheader" nicht zu sehen ist alles während der Kompilierung der "zweiten cpp": es ist nur die Kopfzeile für Ihre "Haupt-cpp-Datei". In der Tat dient der gesamte Zweck von Header-Dateien als gemeinsamer Ort für Deklarationen, die dann in mehrere Übersetzungseinheiten zerlegt werden, was Sie hier tun müssen, indem Sie den notwendigen Code zu Ihrer "zweiten Header-Datei" hinzufügen.

+0

Ich habe die Dateinamen hinzugefügt. Beim Kompilieren, wenn jede Header-Datei cstdio enthält, wird sie nicht mehrfach hinzugefügt? – kaminsknator

+0

@Kaminsknator: Ja. Für Deklarationen in der Kopfzeile ist das kein Problem (deshalb dürfen Sie mehrere Deklarationen für dieselbe Sache schreiben). Für Definitionen, die Sprache erlaubt es mit Vorsicht, und das ist etwas, mit dem der Linker zu kämpfen haben wird, aber es ist sehr gut dabei (weil das ist 50% seiner Arbeit). Das C++ - Kompilierungsmodell ist sicherlich nicht ideal, aber es ist von C geerbt und es funktioniert ziemlich gut. –

+0

Also, wenn ich mir keine Sorgen machen muss, Dinge mehrfach einzutragen, warum gibt es Header-Wächter? – kaminsknator