私はCでプログラムを作成していますが、別の.cファイル(モジュール)に分割しています。C - コードを複数のファイルに適切に分割する
モジュールの中には同じモジュール(たとえばA)が含まれており、これらのモジュール(BとC)が別のモジュール(Dなど)に含まれていると、再定義の問題を引き起こすダイヤモンド " 。
例:
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の
camera.cとsphere.c両方もvec3.cしたがってray.cを含む(そしてため、問題が生じる。この場合#include <stdio.h>
#include <float.h>
#include "sphere.c"
#include "camera.c"
/* ... other stuff ... */
int main() {
/* ... do stuff ... */
}
)ので、これらのモジュールで定義されている構造と関数の二重定義があります。
これらの問題が発生しないようにコードを並べ替えるにはどうすればよいですか?
ありがとうございます!
ソースファイルを '#include'することは絶対にしないでください。 ** only **宣言と* include-guardマクロ*を含むヘッダファイル( '.h')を記述してください。 –
プロジェクトを複数のファイルに分割するルールは1つではありません。 *構造体や宣言(関数プロトタイプのようなもの)は*ヘッダファイル*にあるべきであることを除いて、あなたはソースファイルを '#インクルードするべきではありません! –