打印

一个头文件的困惑

[复制链接]
2680|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hziee30|  楼主 | 2010-12-6 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己写了个头文件spi.h
#ifndef   _SPI_H
#define  _SPI_H
//**************************
#define   SPI_DI                 RC4
#define   SPI_DO                RC5
#define   SPI_SCK              RC3
#define   SPI_CS                 RC2
//****************************
#define   STA_BYTR           0X01
#define   R_CONTROL      0X80
#define   W_CONTROL     0X40      
#define   W_ENABLE         0X30
#define   W_DISABLE       0X00
//*************************
unsigned char  T_data;
//*****************************
void spi_init(void);
void write_enable(void);
void write_disable(void);
void spi_send_byte(unsigned char Data);
void spi_read(unsigned char R_Add, unsigned char *R_Data);
void spi_write(unsigned char W_Add, unsigned char *W_Data);

#endif

在我的spi.c文件里我没有再定义T_data,即没有给T_data赋值,而是直接在函数void spi_send_byte(unsigned char Data)应用

#include "spi.h"

void spi_init(void)
{
   TRISC = 0X10;
   SSPSTAT = 0X80;
   SSPCON = 0X32;
   INTCON = 0X00;
   PIR1 = 0X00;
   SPI_CS = 0;
}
/*********************************
写一个字节数据数据
***********************************/
void spi_send_byte(unsigned char Data)
{
   SSPBUF = Data;
   while(!SSPIF);
   SSPIF = 0;
   T_data = SSPBUF;
}
另有其他函数省略

这样的结果是在编译的时候出现
Error[000]:multiply defined symbol: _T_data
我想知道在头文件声明了的变量,在其.C的文件里一定要定义吗?
沙发
POINTRTOS| | 2010-12-7 07:50 | 只看该作者
头文件内一般不要声明变量,因为头文件可能被不同模块使用,或者就算只有一个模块,也有可能被不同头文件使用,这样就会有多份样本.导致你所说的问题.当然,如果你只有一个模块与一个头文件例外.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hziee30 + 1
板凳
e掾木| | 2010-12-7 08:14 | 只看该作者
本帖最后由 e掾木 于 2010-12-7 08:22 编辑

比较复杂的工程设计不是一个H文件就可以搞定。我贴一个工程的定义,LZ琢磨一下。

/************ header.h**************/
#ifdef        __GLOBAL__
#define     GLOBAL_EXT
#else
#define        GLOBAL_EXT   extern
#endif
......

GLOBAL_EXT   unsigned int   yoursValueOnGlobal;

/* End of header.h */
然后在某一个调用此H的C文件定义一次:#define  __GLOBAL__
头文件被多重编译是玩转RTOS的基本技术。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hziee30 + 1
地板
hziee30|  楼主 | 2010-12-7 08:38 | 只看该作者
谢谢各位指教

使用特权

评论回复
5
kvdong| | 2010-12-7 16:59 | 只看该作者
把你的头文件中“unsigned char  T_data;”前边加上extern(非必须,非必须是说"extern unsigned char T_data"非必须)。
然后在SPI.C里用“unsigned char  T_data;”定义就行了。

编译器会把“unsigned char  T_data;”当成变量的定义,而不是声明处理。而定义变量一定
要放到.C文件里,以防止重复定义。

使用特权

评论回复
6
yellowland| | 2010-12-13 09:23 | 只看该作者
在.c中定义,在.h中申明,养成好习惯

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

34

帖子

0

粉丝