加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

需要一些关于C头包含的建议

发布时间:2020-12-16 09:46:41 所属栏目:百科 来源:网络整理
导读:介绍 我是一名经验丰富的程序员,并且在面向对象范例方面拥有多年的经验.最近我决定尝试使用比C#或Java等语言更低级的语言更熟悉和舒适,所以我正在深入研究C,并试图用它创建一些游戏. 一切进展顺利,现在我试图通过将函数定义移动到单独的.c文件中来更好地组织
介绍

我是一名经验丰富的程序员,并且在面向对象范例方面拥有多年的经验.最近我决定尝试使用比C#或Java等语言更低级的语言更熟悉和舒适,所以我正在深入研究C,并试图用它创建一些游戏.

一切进展顺利,现在我试图通过将函数定义移动到单独的.c文件中来更好地组织我的代码.这是我开始感到不舒服的地方,因为C中包含的性??质.我非常熟悉它的工作方式,以及编译期间的预处理阶段.问题是我仍然不确定我是否正确处理了这个问题.

我认为我的问题类似于here所提出的问题.虽然它并不能完全满足我需要知道的内容.

问题

基本上,我正在使用两个库创建一个OpenGL项目.一个是glew(对于OpenGL函数加载),另一个是GLFW(用于窗口处理和OpenGL上下文创建).我有两个.c文件,一个名为main.c,另一个名为windowInitialize.c.问题是,main.c和windowInitialize.c都依赖于glew和glfw库.

在我的main.c文件中,我执行以下操作包括:

#include "includes/GLEW/glew.h"
#include "includes/GLFW/glfw3.h"
#include "windowInitialize.h"

此外,main.c执行以下相关函数调用:

if (!initializeGLFW())
 return -1;

GLFWwindow *window = createOpenGLWindow(3,3,640,480,"Hello OpenGL");

/* It is important that we initialize glew AFTER initializing GLFW and setting up
the OpenGL context,as GLEW needs a current context to work */
initializeGLEW();

windowInitialize.c包含函数initializeGLFW和initializeGLEW的定义,以及createOpenGLWindow. main.c源仍然使用glew和glfw用于主循环目的,引用函数等来自两者.

现在,windowInitialize.c包含以下内容:

#include "windowInitialize.h"
#include "includes/GLEW/glew.h"
#include "includes/GLFW/glfw3.h"
#include <stdio.h>

然后继续填写函数定义.这就是交易.如果glew和glfw库,以及stdio实际上(用于打印调试消息等),两个文件都需要使用.

我觉得这不是正确的做法,但我不确定.我相信编译器/链接器不抱怨双重声明的原因是因为main.c和windowInitialize.c获取了单独的目标代码文件.

我的问题是,链接器是否足够巧妙,只能将这些声明放在可执行文件中一次?即使我将这些标题包括在几个地方,它也不会对文件大小产生任何影响吗?这甚至是处理几个源文件之间的公共依赖关系的正确方法吗?或者我应该使用另一种方法?

解决方法

你所描述的一切似乎都是正常的做事方式.您的两个编译单元只在这些头中获得相同的函数前向声明,而不是库中的实际重复定义.

My question is though,is the linker clever enough to only put these declarations in the executable file once?

链接器当然不关心你包含的头文件 – 它是一个链接器,而不是编译器.

So that even though I include these headers several places,it won’t have any effect on file size and such?

函数的额外/未使用的前向声明对二进制大小没有影响.

And is this even the correct way of handling common dependencies between several source files?

是的,你似乎是以完全正常的方式做事.

对于您的项目,您应该做的事情如下:

cc -c -o main.o main.c                           # compile main.c
cc -c -o windowInitialize.o windowInitialize.c   # compile windowInitialize.c
cc -o myProgram main.o windowInitialize.o -lglew -lglfw # link objects with necessary libraries to create executable

但是,真的,使用makefile会更好:

myProgram: main.o windowInitialize.o
    cc -o $@ $^ -lglew -lglfw

使用它的例子:

$make
cc    -c -o main.o main.c
cc    -c -o windowInitialize.o windowInitialize.c
cc -o myProgram main.o windowInitialize.o -lglew -lglfw

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读