您好、欢迎来到现金彩票网!
当前位置:最新捕鱼棋牌 > 文件结构 >

c语言 多文件多函数结构

发布时间:2019-08-09 20:41 来源:未知 编辑:admin

  写一个多文件多函数结构的C程序,main函数中调用另外两个函数(main.c、f1.c、f2.c)。然后自己写一个头文件(xx.h),声明调用的函数。请问h文件应该放在哪个文件夹?必须放到系统默认存...

  写一个多文件多函数结构的C程序,main函数中调用另外两个函数(main.c、f1.c、f2.c)。然后自己写一个头文件(xx.h),声明调用的函数。请问h文件应该放在哪个文件夹?必须放到系统默认存放头文件的文件夹吗?另外f1.c、f2.c文件应该存放在那里?

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  C++编程入门系列之二十四(C++程序设计必知:多文件结构和编译预处理命令)分类标签: C++ 编程入门 -

  鸡啄米上一讲给大家讲了常引用、常对象和对象的常成员,今天给大家讲下编程入门知识--多文件结构和编译预处理命令。

  之前鸡啄米给大家看了很多比较完整的C++程序的例子,大家可能发现了,它们的结构基本上可以分为三个部分:类的声明、类的成员函数的实现和主函数。因为代码比较少,所以可以把它们写在一个文件中,但是我们实际进行软件开发时,程序会比较复杂,代码量比较大,

  一个程序按结构至少可以划分为三个文件:类的声明文件(*.h文件)、类的实现文件(*.cpp文件)和主函数文件(使用到类的文件),如果程序更复杂,我们会为每个类单独建一个声明文件和一个实现文件。这样我们要修改某个类时就直接找到它的文件修改即可,不需要其他的文件改动。

  鸡啄米在第十九讲中讲生存期时有个时钟类的例子,现在鸡啄米给大家看下将那个程序按照上面说的结构分到三个文件里:

  Clock.cpp和main.cpp都使用#include Clock.h把类Clock的头文件Clock.h包含进来。#include指令的作用就是将#include后面的文件嵌入到当前源文件该点处,被嵌入的文件可以是.h文件也可以是.cpp文件。如果不包含Clock.h,Clock.cpp和main.cpp就不知道Clock类的声明形式,就无法使用此类,所以所有使用此类的文件都应该包含声明它的头文件。关于#include指令下面鸡啄米会讲。

  上面的程序在编译时,由Clock.cpp和Clock.h编译生成Clock.obj,由main.cpp和Clock.h编译生成main.obj,然后就是链接过程,Clock.obj和main.obj链接生成main.exe可执行文件。如果我们只修改了类的实现文件,那么只需重新编译Clock.cpp并链接就可以,别的文件不用管,这样就提高了效率。在Windows系统中的C++程序用工程来管理多文件结构,而Unix系统一般用make工具管理,如果大家从事Unix系统软件开发,就需要自己写make文件。

  编译器在编译源程序以前,要由预处理程序对源程序文件进行预处理。预处理程序提供了一些编译预处理指令和预处理操作符。预处理指令都要由“#”开头,每个预处理指令必须单独占一行,而且不能用分号结束,可以出现在程序文件中的任何位置。

  #include指令也叫文件包含指令,用来将另一个源文件的内容嵌入到当前源文件该点处。其实我们一般就用此指令来包含头文件。#include指令有两种写法:

  使用这种写法时,会在C++安装目录的include子目录下寻找中标明的文件,通常叫做按标准方式搜索。

  使用这种写法时,会先在当前目录也就是当前工程的目录中寻找中标明的文件,若没有找到,则按标准方式搜索。

  如果你学过C语言,就会知道用#define可以定义符号常量,比如,#define PI 3.14 这条指令定义了一个符号常量PI,它的值是3.14。C++也可以这样定义符号常量,但一般更常用的是在声明时用const关键字修饰。C语言还用#define定义参数宏,来实现简单的函数运算,比如,#define add(x,y) (x+y) 这条指令说明如果我们用到add(1,2)则预处理后就会用(1+2)代替,C++中一般用内联函数来实现。

  用条件编译指令可以实现某些代码在满足一定条件时才会参与编译,这样我们可以利用条件编译指令将同一个程序在不同的编译条件下生成不同的目标代码。例如,我们可以在调试程序时加入一些调试语句,用条件编译指令控制只有在debug模式下这些调试语句才参与编译,而在release模式下不参与编译。

  程序正文2 //当“常量表达式1”为零、“ 常量表达式2”非零时本程序段参与编译

  程序正文n //当“常量表达式1”、...、“常量表达式n-1”均为零、“ 常量表达式n”非零时本程序段参与编译

  如果“标识符”经#defined定义过,且未经undef删除,则编译程序段1,否则编译程序段2。

  define是预处理操作符,不是指令,所以不能用#开头。使用形式为:define(标识符)。如果括号里的标识符用#define定义过,并且没有用#undef删除,则define(标识符)为非0,否则为0。可以这样使用:

  main.cpp包含了file1.h文件,file1.h又包含了head.h文件,main.cpp还包含了file2.h文件,file2.h也包含了head.h文件,那么main.cpp就包含了两次head.h文件,在编译时就会报错,说head.h中的类A重复定义了。这时我们可以在被重复包含的文件head.h中使用条件编译指令,用一个唯一的标识符来标识head.h文件是否已经编译过,如果已经编译过则不会重复编译了。鸡啄米给大家改写下上面的head.h文件:

  在这个改好的head.h文件中,上来会先判断HEAD_H是否被定义过,如果没有被定义过,则head.h文件还没参与过编译,就编译此文件中的源代码,同时定义HEAD_H,标记head.h文件已经参与过编译。如果HEAD_H已经被定义过,则说明此文件已经参与过编译,编译器会跳过本文件左右内容编译其他部分,类A也不会有重复定义的错误了。

  而且可以使用include *.C的形式,为了避免麻烦,可以都放在工作目录下!更多追问追答追问的确把 改成 头文件不报错了。我在头文件里声明了f1.c文件和f2.c文件中的两个函数,然后这两个c文件和main.c放在一个目录里,运行main.c显示两个函数(f1.c和f2.c中定义的)没有定义。请问该怎么改追答这样

  我写嵌入式时经常这样写。追问是不是c-free不支持这样写,我照你说的改了,报错说f1.c和f2.c里已经定义了main函数。。。。追答把f1.c和f2.c添加的main.c的工程,直接编译全部。

  放在哪里不重要。当你用IDE编写程序的时候,放在IDE指定的目录就好了嘛。因为一般的IDE都可以“新建”某种类型的文件,代码粘进去就好。另外实在不行的话,include一下就好,include会查找编译器目录以及当前文件目录,你把.h文件.c文件放在一起,也是可以找到的我把所有的文件放到一个文件夹,运行main.c有错误,说f1.c、f2.c没有定义。

http://kentdale-scouts.com/wenjianjiegou/777.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有