C头文件#include语句和依赖项

时间:2015-10-21 15:06:36

标签: c opengl struct include

这是一个我一直在阅读的问题,但我仍然不清楚如何工作,因为我正在构建错误或不完整的类型lint错误。

我有一个需要opengl的项目,我正在编写低级opengl函数,然后我想建立在那些翻译[此后称为TU]单元之上,以构建更高级别的TU。

例如。

我有一个common_structs.h,它定义了一些这样的东西:

common_structs.h
#ifndef COMMON_STRUCTS_H
#define COMMON_STRUCTS_H

#include <OpenGL.h>

struct renderable_2D {
    ...
    float angle;
    GLshort vertex_count;
    GLfloat vertices[12];
    GLfloat colors[16];
    GLshort indices[6];
    GLfloat tex_coords[8];
    ...
};

struct texture_2D {
    ...
    GLuint texture_id;
    ...
};

struct default_shader {
    const char* vertex_shader_srouce;
    const char* fragment_shader_source;
    GLuint shader_program;
};

struct camera_2D {....};

#endif /* COMMON_STRUCTS_H */

我在自己的头文件中声明了这些结构,以避免循环依赖。 此文件未编译但我需要#include opengl清除GLtypes的lint警告。 接下来是头和源TU,它们实现了这些类型的功能。通常

让我们看一下renderable_2D,例如:

#ifndef RENDERABLE_2D_H
#define RENDERABLE_2D_H

#include "../../common/common_structs.h" //include the definition of renderable_2d

struct renderable_2D* ren2d_new(void);
struct renderable_2D* ren2d_set_uv(struct renderable_2D* out, const float uv[]);
struct renderable_2D* ren2d_set_tint(struct renderable_2D* out, const float r,
                                     const float g, const float b,
                                     const float a);
struct renderable_2D* ren2d_set_alpha(struct renderable_2D* out, const float a);
struct renderable_2D* rend2d_set_z_index(struct renderable_2D* out,
                                         const int index);
struct renderable_2D* rend2d_set_angle(struct renderable_2D* out,
                                          const float angle);

#endif /* RENDERABLE_2D_H */

和一些源文件:

#include "../headers/renderable_2D.h"
#include <stdlib.h>

此文件包含标头并实现这些功能。接下来还有一个标题文件。

core_graphics.h

#ifndef CORE_GRAPHICS_H
#define CORE_GRAPHICS_H


#include "renderable_2D/headers/renderable_2D.h"
#include "default_shader/headers/default_shader_2D.h"
#include "default_camera_2D/headers/default_camera_2D.h"

#endif /* CORE_GRAPHICS_H */

这只是一个标题TU,它将包括组成这部分库的所有子TU。它应该被构建为一个共享库,因此接下来是另一个共享库 #include core_graphics/core_graphics.h

这就是问题所在。说我有另一个TU main.c,主要看起来像这样。

的main.c

#include "core_graphics/core_graphics.h"
#include <stdlib.h>

int main(int argc, char* argv[])
{
   struct renderable_2D* rend = (struct renderable_2D*)calloc(1, sizeof(struct renderable_2D));
   return 0;
}

我尝试calloc结构的行我得到lint错误说

invalid application of 'sizeof' to an incomplete type 'struct renderable_2d'

现在不完整的类型说它无法找到struct renderable_2D的定义,但是,从上面列出的来源,是否应该包含它?

core_graphics.h有common_structs.h的定义,它包含struct的定义吗?

struct renderable_2D - &gt; common_structs.h - &gt; core_graphics.h - &gt; main.c中

0 个答案:

没有答案