Quelldateien
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 3 von 61.
Bisher haben wir Funktionsdeklarationen in Header-Dateien platziert, aber der eigentliche Funktionscode (die Definition) befand sich in der Hauptdatei. Der nächste Schritt in der modularen Programmierung besteht darin, diese Definitionen in eigene Quelldateien (.c-Dateien) zu verschieben.
Dies erzeugt eine saubere dreiteilige Struktur: Der Header deklariert Funktionen, eine separate Quelldatei definiert diese und main verwendet sie einfach. So sieht es aus:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Beachten Sie, dass math_utils.c seinen eigenen Header einbindet. Dies stellt sicher, dass die Funktionsdefinition mit der Deklaration übereinstimmt – wenn sie nicht übereinstimmen, wird der Compiler den Fehler erkennen. Die Hauptdatei muss lediglich den Header einbinden, um die Funktion zu verwenden; sie muss nicht wissen, wie add intern funktioniert.
Diese Trennung hält Implementierungsdetails verborgen und ermöglicht es Ihnen, die Funktionslogik zu ändern, ohne Dateien zu berühren, die diese Funktionen verwenden.
Aufgabe
EinfachLassen Sie uns ein einfaches Mathematik-Utility erstellen, indem wir Ihren Code in die richtige Drei-Dateien-Struktur organisieren: einen Header für Deklarationen, eine Quelldatei für Implementierungen und eine Hauptdatei, die diese verwendet.
Sie werden drei Dateien erstellen:
math_ops.h: Ihre Header-Datei, die Funktionsdeklarationen für zwei Operationen enthält:multiplyundsubtract. Beide Funktionen nehmen zwei Ganzzahlen entgegen und geben eine Ganzzahl zurück. Vergessen Sie nicht, Guards mit dem SymbolMATH_OPS_Heinzufügen.math_ops.c: Ihre Quelldatei, welche die tatsächlichen Implementierungen vonmultiplyundsubtractenthält. Diese Datei sollte ihren eigenen Header inkludieren, um sicherzustellen, dass Deklarationen und Definitionen übereinstimmen.main.c: Ihre Hauptdatei, die den Header inkludiert und beide Funktionen verwendet, um Berechnungen durchzuführen.
Die Funktion multiply sollte das Produkt zweier Ganzzahlen zurückgeben, und subtract sollte die erste Ganzzahl minus der zweiten zurückgeben.
Sie erhalten zwei Ganzzahl-Eingaben: a und b.
Geben Sie in Ihrer Hauptfunktion die Ergebnisse beider Operationen in separaten Zeilen aus:
Product: {result of multiply}
Difference: {result of subtract}Zum Beispiel wäre bei den Eingaben 8 und 3 die Ausgabe:
Product: 24
Difference: 5Spickzettel
Funktionsdefinitionen können aus der Hauptdatei in separate Quelldateien (.c-Dateien) verschoben werden, wodurch eine dreiteilige modulare Struktur entsteht:
- Header-Datei (
.h): Enthält Funktionsdeklarationen - Quelldatei (
.c): Enthält Funktionsdefinitionen - Hauptdatei (
main.c): Verwendet die Funktionen
Beispielstruktur:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Die Quelldatei (.c) sollte ihren eigenen Header einbinden, um sicherzustellen, dass die Funktionsdefinition mit der Deklaration übereinstimmt. Die Hauptdatei muss nur den Header einbinden, um die Funktionen zu verwenden, wodurch die Implementierungsdetails verborgen bleiben.
Probier es selbst
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: Rufe die Funktion multiply mit a und b auf und speichere das Ergebnis
// TODO: Rufe die Funktion subtract mit a und b auf und speichere das Ergebnis
// TODO: Gib die Ergebnisse in folgendem Format aus:
// Product: {result of multiply}
// Difference: {result of subtract}
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-Implementierung