c的include是怎么包含的????
比如我弄了个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




