4556|7

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

多文件工程中,怎样调用外部函数? [复制链接]

我刚刚接触调用外部函数,不是太懂,手头又没有这方面系统讲解的资料,我的一个工程中包含了三个文件,分别为Main.c,     RTC.c ,     Temper.c ,我要在Main 中的mian()函数中调用后两个文件的函数。该如何操作?

我自己试着编的程序,如下,调试发现五个WARING,    2个ERROR,意思是重复定义了两个外部函数。明白人帮我看看是 怎么回事吧,看看我的外部变量和函数声明的对吗?
//main.c
#include
#include"RTC.c"
#include "Temper.c"

#include
#include
#include

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++){WDTCN=0xa5;};  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x88;
}

void main(void)
{
extern uchar second;
extern uchar ptTemper[4],ptTemp_Average[4];   /*声明外部变量*/
extern void  ReadRTC();
extern void WriteRTC(uchar Year,uchar Month,uchar Day,uchar Hour,uchar Minute,uchar Second);
extern void Delay1s();
extern Read_Temperature(uchar *ptTemp,uchar n);      
extern Temp_Con(uchar *ptTemp_Avr);                        /*声明外部函数*/
EA=0;
WDTCN=0xde;
WDTCN=0xad;//禁止看门狗
Oscillator_Init();

//I/O 初始化
P1MODE=0xff;         
PRT1CF=0x00;

P1=0xe5;

PRT2CF &=0x7f;         
    P2MODE |=0x0c;         
    P2|=0x0c;         

     WriteRTC(0,0,0,0,0,0);       //Initialize RTC
     Delay1s();

  do{

          ReadRTC();
         if (second==8)
        {
            Read_Temperature(ptTemper,1);     

           Read_Temperature(ptTemper,2);   

           Temp_Con(ptTemp_Average);
        }

     }         while (1);

}


调试错误:

COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2004
*** WARNING C235 IN LINE 27 OF MAIN.C: parameter 2: different types
*** WARNING C235 IN LINE 27 OF MAIN.C: parameter 3: different types
*** WARNING C235 IN LINE 27 OF MAIN.C: parameter 4: different types
*** WARNING C235 IN LINE 27 OF MAIN.C: parameter 5: different types
*** WARNING C235 IN LINE 27 OF MAIN.C: parameter 6: different types
*** ERROR C231 IN LINE 29 OF MAIN.C: '_Read_Temperature': redefinition
*** ERROR C231 IN LINE 30 OF MAIN.C: '_Temp_Con': redefinition

C51 COMPILATION COMPLETE.  5 WARNING(S),  2 ERROR(S)

最新回复

在其它".c"中 #include "somefile.h" 就可以用它的变量a和函数fxn了  详情 回复 发表于 2007-7-1 10:49
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在同一个工程中,不同文件只要调用非本文件里的函数(就算是在本文件里的函数,在定义前调用)必须先声明.具体你可以在文件开始处声明,也可以将声明写入相应的头文件然后用头文件包含将其加入.

外部的声名应用关键字:extern

具体你可以看看C语言里对这个关键字的讲述.
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
#include"RTC.c"
#include "Temper.c"

头文件包含只能包含,.H或HPP文件

 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 

我用gcc编译同LZ类似的例子是可以的:
//Function multiply() defined in file1.c, sum() defined in file2.c
#include
#include "file1.c"
#include "file2.c"
int main()
{
    extern int multiply();
    extern int sum();

    int a, b;
    int result;

    printf("Please input a and b(Format:a,b):");
    scanf("%d, %d", &a, &b);
    result = multiply(a, b);
    printf("The result of multiply is: %d\n", result);
    result = sum(a, b);
    printf("The result of sum is: %d\n", result);

    return 0;
}
但是我注析掉
//#include "file1.c"
//#include "file2.c"
后就会提示出错信息:undefined reference multiply and sum.
-------
鉴于不同的编译器会出现不一样的结果,
include *.c 是不规范,可以注析掉试试,
还有,可以在"RTC.c"和"Temper.c"里被其他文件调用的函数加上 extern。
编译器提示“redefinition”,也可以只注析掉
// extern Read_Temperature(uchar *ptTemp,uchar n);      
// extern Temp_Con(uchar *ptTemp_Avr);
这两句试试。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
用extern声明后再使用。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
头文件中定义
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
一般地, 在".h"中放声明, 要尽量避免在".h"中产生存储分配.

在".c" 中
int a;
int fxn(int p)
{
  return 0;
}

在".h" 中
extern int a;
int fxn(int p);
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

8
 
在其它".c"中
#include "somefile.h"
就可以用它的变量a和函数fxn了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表