CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

c的include是怎么包含的????

楼主jzg1234(雨中夕阳)2005-04-03 18:10:35 在 C/C++ / C语言 提问

比如我弄了个myhead.h声明了一些函数,在myhead.c中或者其他的文件中实现了该函数,怎么样使别的文件比如my.c调用该函数的时候只写#include   "myhead.h"   就可以了呢    
  ???  
  麻烦各位高人帮忙包myhead.h和myhead.c举个例子  
  不胜感激 问题点数:50、回复次数:18Top

1 楼zengwujun(月之海 为linux入门奋斗100天)回复于 2005-04-03 18:24:15 得分 0

hello.h  
  void   hello();  
   
  hello.c  
  #include   <stdio.h>  
  void   hello()  
  {  
  printf("hello!");  
  }  
   
  test.c  
  #include   "hello.h"  
   
  void   main()  
  {  
  hello();  
  }Top

2 楼bigmouse2002(平风造雨*四无君)回复于 2005-04-03 18:34:18 得分 0

编译的时候加路径/或者用   include   "$path/xxx.h"   还有就是extern    
  include的头文件一般只设计来作声明,具体的实现在.c文件中,.c编译成库和.h一起使用!Top

3 楼jronald(深白色)回复于 2005-04-03 18:42:45 得分 0

编译只需要函数原型,主要有两个用处  
  1检验函数调用语法  
  2编译器记住这个函数名,在link时到obj文件中找,把函数实现部分放到exe中Top

4 楼kobefly(科比--网络学习中)回复于 2005-04-03 19:27:15 得分 5

在程序编译之前,首先由预处理器检查程序。在   GCC   工具链中,gcc   和   g++   分别是C/C++   编译程序,而预处理程序叫   cpp,是独立的。根据程序中使用的预处理器指令,预处理器使用符号缩略语所代表的内容替换程序中的缩略语。预处理指令以   #   为行首,一条指令占据一行。预处理器不能理解c/c++,它一般可以接收任何文本并按照替换规则将其转换成其他文本。  
   
  头文件通过   include   预处理器指示符(preprocessor   include   directive)   而成为我们程序的一部分。预处理器发现   #include   指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include   指令,   就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。  
  #include   指令有两种使用形式  
  #include   <stdio.h>   文件名放在尖括号中  
  #include   “mystuff.h”   文件名放在双引号中  
   
  尖括号<   和>   括起来表明这个文件是一个工程或标准头文件。查找过程会检查预定义的目录,我们可以通过设置搜索路径环境变量或命令行选项来修改这些目录。在   gcc   中可以使用   -I   参数修改默认查找路径。  
  如果文件名用一对引号括起来则表明该文件是用户提供的头文件,查找该  
  文件时将从当前文件目录(或文件名指定的其他目录)中寻找文件,然后再在标准位置寻找文件。  
  因为计算机系统的结构不完全相同,   所以ANSI   C不要求对文件采用一样的目录模式。一般而言,命名文件的方法依赖于系统,但是尖括号和双引号的使用则与系统无关。  
  为什么要包含文件呢?  
  因为这些文件包含了编译器所需的信息,如函数的声明、常量的定义等。例如,   标准库头文件stdio.h文件通常包含EOF,NULL,getchar()和putchar()的定义。  
  包含大型头文件并不一定显著增加程序的大小。很多情况下,头文件中的内容是编译器产生最终代码所需的信息,而不是加到最终代码里的具体语句。  
   
  被包含的文件还可以含有#include   指示符由于嵌套包含文件的原因一个头文件可能会被多次包含在一个源文件中条件指示符可防止这种头文件的重复处理。  
  例如:  
  #ifndef   BOOKSTORE_H  
  #define   BOOKSTORE_H  
   
  /*   Bookstore.h   的内容   */  
   
  #endif  
  条件指示符#ifndef   检查BOOKSTORE_H   在前面是否已经被定义,这里BOOKSTORE_H是一个预编译器常量习惯上预编译器常量往往被写成大写字母,如BOOKSTORE_H在前面没有被定义则条件指示符的值为真于是从#ifndef   到#endif   之间的所有语句都被包含进来进行处理。相反,如果#ifndef   指示符的值为假则它与#endif   指示符之间的行将被忽略,为了保证头文件只被处理一次,把如下#define   指示符  
  #define   BOOKSTORE_H  
  放在#ifndef   后面这样在头文件的内容第一次被处理时BOOKSTORE_H   将被定义  
  从而防止了在程序文本文件中以后#ifndef   指示符的值为真。  
  只要不存在两个必须包含的头文件要检查一个同名的预处理器常量这样的情形这  
  个策略就能够很好地运作。#ifdef   指示符常被用来判断一个预处理器常量是否已被定义以便有条件地包含程序代码。  
  #ifdef   除了用于防止重复包含,还可以用于针对不同环境的条件编译。经常出现的有  
  #if   defined   (__GCC__)   ||   defined   (__SUN_C__)    
  之类的指令,就是针对不同编译器、平台进行选择编译的预处理指令。当编译环境没有定义这个特定的符号的时候,则预处理器会自动忽略这一部分的代码。除了用   #ifdef   判断符号是否定义,还可以判断符号的值。VC   中常见的将   MSC_VER   与特定值比较以判断   VC   的版本的做法就是这个道理。  
  除了以上提到的一些内容,还有一些相对少见的预处理器指令,如   #pragma。它们分别提供了一些特殊的优化手段和编译器控制方法,可以显著提高代码质量减轻编码负担,但是很多时候使用这些编译指令可能是不兼容于其他编译环境的,因此在项目中选用非标准预处理指令的时候,应该在可移植性和编码的优势中进行衡量后作决定。  
  Top

5 楼jzg1234(雨中夕阳)回复于 2005-04-03 20:50:45 得分 0

zengwujun(月之海)    
  ----------------  
  你的这个什么不行  
  我也是这么写的,不过错误还是一样的啊  
  Undefined   symbol   '_hello'   in   module   test.c  
   
  怎么回事啊   ???  
  ===========================  
  楼上各位说的都很好  
  这些东西我也知道  
  我现在只是想知道怎么样写出个.h文件来  
  只包含声明不包含实现就可以使用  
  就象使用库函数一样    
  只有个"#include   <stdio.h>"就可以用其中的函数了    
  其他的什么我也知道啊    
  虽然我水平不高可还是有点了解的啊  
   
  希望楼下的能帮忙象   zengwujun(月之海)   那样的例子  
  不过最好是可以成功的啊  
  *^_^*  
   
  Top

6 楼jzg1234(雨中夕阳)回复于 2005-04-03 20:54:00 得分 0

编译没问题就是运行不行  
  Top

7 楼jzg1234(雨中夕阳)回复于 2005-04-03 21:11:04 得分 0

是在tc下做的    
  还有问一下,tcc.exe和tlink.exe的参数怎么看啊???Top

8 楼coldcrane(清风明月)回复于 2005-04-04 00:20:27 得分 10

to   jzg1234(雨中夕阳):  
      在TC下需要手工做一个项目文件,项目必须同时包含myhead.c和my.cTop

9 楼coldcrane(清风明月)回复于 2005-04-04 00:28:03 得分 0

例如:  
  创建一个项目文件“my.prj”  
  文件内容为:  
  my.c  
  myhead.cTop

10 楼jackyqjy(小奕)回复于 2005-04-04 09:05:03 得分 10

实在不行的话,写“#include   "路径名+文件名+后缀名"”,当然这个办法不是很好的!Top

11 楼halfdream(哈欠)回复于 2005-04-04 09:16:02 得分 0

怎么会呢?应很容易的,  
   
  命令行:  
  tcc   test.c   hello.c  
   
   
  或者用C++BUILDER下面,,  
  bcc32   test.c     hello.cTop

12 楼cppprogramlover(爱相随—)回复于 2005-04-07 05:20:48 得分 10

接分!!!!!!!!!!!!!!!!!!!!!!!  
   
  按照你的意思,只要分别都编译了,最后连接在一起就行了,做成工程文件实际上编译器就是把他们一起连接Top

13 楼Flood1984(峰子)回复于 2005-04-07 08:48:20 得分 0

只要能将myhead.c编译并连接进去就行了。Top

14 楼Wolf0403(废人:独活十年~心如刀割)回复于 2005-04-07 10:12:19 得分 10

在   新手乐园   版面   FAQ   中有详细的   include   介绍Top

15 楼Wolf0403(废人:独活十年~心如刀割)回复于 2005-04-07 10:12:52 得分 0

……   kobe   兄好勤快……Top

16 楼Wolf0403(废人:独活十年~心如刀割)回复于 2005-04-07 10:17:23 得分 5

回复人:cppprogramlover(爱相随—)   (   一级(初级))   信誉:100   2005-04-07   05:20:00   得分:0  
   
  >>   按照你的意思,只要分别都编译了,最后连接在一起就行了,  
  >>   做成工程文件实际上编译器就是把他们一起连接  
   
  这句解释得非常到位了。头文件中所包含的只是函数的声明;它告诉编译器,有这样一个函数,所以编译器知道这样的调用语法是正确的。之于在运行时候成功调用函数的实现,则是链接器的问题。  
  有两种方式。一是把包含函数实现的文件编译成对象文件   .o,然后和   main.o   链接在一起;或者,把函数实现编译成库(静态/动态,在   win32   平台分别是   lib   和   dll),然后链接。  
  http://community.csdn.net/Expert/TopicView.asp?id=3410946Top

17 楼baihei(白黑)回复于 2005-04-07 10:47:08 得分 0

这个东西我也很感兴趣,顶一下Top

18 楼jzg1234(雨中夕阳)回复于 2005-04-10 17:30:01 得分 0

多谢各位了*^_^*Top

相关问题

  • include “another.C"后缀怎么是C?
  • C和C++是怎么回事啊?
  • 我是初学者,怎么学C,C++
  • c#怎么读?
  • c怎么学?
  • C#怎么念?
  • 怎么c++
  • c,还是c++?
  • GNU C/C++ 是怎么知道库的位置的?
  • C++builder的Object Inspector是怎么做的?

关键词

  • c/c++
  • 文件
  • 函数
  • 编译器
  • 编译
  • 指令
  • 指示
  • 文件名
  • 代码
  • 内容

得分解答快速导航

  • 帖主:jzg1234
  • kobefly
  • coldcrane
  • jackyqjy
  • cppprogramlover
  • Wolf0403
  • Wolf0403

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo