Ich schreibe ein Programm in C und teile die Teile in verschiedene .c-Dateien (Module).C - den Code korrekt in mehrere Dateien partitionieren
Einige Module (sagen B und C) enthalten das gleiche Modul (sagen A) und wenn diese Module (B und C) von einem anderen Modul enthalten sind (zB D), entsteht eine Rautenhierarchie, die Neudefinitionsprobleme verursacht .
Eg.
vec3.c
#include <math.h>
typedef struct {
float x, y, z;
} vec3;
float dot(vec3 v1, vec3 v2) {
return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
}
/* ... other stuff ... */
ray.c
#include "vec3.c"
typedef struct {
vec3 A, B;
} ray;
vec3 origin(ray r) {
return r.A;
}
/* ... other stuff ... */
sphere.c
#include "ray.c"
typedef struct {
float t;
vec3 p;
vec3 n;
} record;
typedef struct {
vec3 center;
float radius;
} sphere;
typedef enum {false, true} bool;
bool hit_sphere(sphere s, ray r, float tmin, float tmax, record *rec) {
/* ... do stuff ... */
}
/* ... other stuff ... */
camera.c
#include "ray.c"
typedef struct {
vec3 origin;
vec3 lower_left_corner;
vec3 horizontal;
vec3 vertical;
} camera;
/* ... other stuff ... */
vec3 origin = {0.0, 0.0, 0.0};
vec3 lower_left_corner = {-2.0, -1.0, -1.0};
vec3 horizontal = {4.0, 0.0, 0.0};
vec3 vertical = {0.0, 2.0, 0.0};
camera cam = {origin, lower_left_corner, horizontal, vertical};
main.c
#include <stdio.h>
#include <float.h>
#include "sphere.c"
#include "camera.c"
/* ... other stuff ... */
int main() {
/* ... do stuff ... */
}
In diesem Fall ergibt sich das Problem, weil sowohl camera.c und sphere.c ray.c gehören (und daher auch vec3.c), so dass die in diesen Modulen definierten Strukturen und Funktionen doppelt definiert sind.
Wie kann ich den Code neu anordnen, um diese Probleme nicht zu haben?
Danke!
Sie sollten ** niemals ** Quelldateien einschließen. Schreiben Sie Header-Dateien ('.h') mit ** nur ** Deklarationen und * include-guard-Makros *. –
Es gibt keine einzige Regel, um ein Projekt in mehrere Dateien aufzuteilen. * Außer *, dass Strukturen und Deklarationen (wie Funktionsprototypen) in * Header-Dateien * sein sollten und Sie niemals Quelldateien "einschließen" sollten! –