打印

请教一个与C程序相关的问题

[复制链接]
2158|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duanlang|  楼主 | 2010-4-15 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位前辈,小弟最近阅读一些程序,遇到一个问题一直很困惑,诚心请教。
用C语言编写的单片机程序,含有多个C文件,多个h 文件,在含有main函数的C文件中,第一条指令是#define a,这里的a泛指一个变量,而在用户自定义的一个h文件中,与之对应的有这样几条指令:
#ifndef a   
    #define EXT extern
#else
    #define EXT
#endif
我知道这是条件编译,这样写结果是执行:  #define EXT
我要问的是,这几条指令的意义是什么?为了达到一个什么目的?我在好几种芯片包括pic,avr,freescale都见到这种形式,望前辈指点迷津!

相关帖子

沙发
ShakaLeo| | 2010-4-15 21:01 | 只看该作者
这种用法应该是在h文件中定义各个C文件用到的变量,然后每个C文件都包含所有的h文件,对于有#define a的C文件来说,EXT被空字符串替换,EXT  int var1其实就是int var1,是定义一个变量,对于没有#define a的C文件来说,EXT被extern替换,EXT  int var1就是extern int var1,是声明一个外部变量。

这样做的好处就是可以在各个h文件中定义相应C文件中使用的变量,然后每个C文件都包含所有的C文件。

使用特权

评论回复
板凳
hgjinwei| | 2010-4-15 21:01 | 只看该作者
不过就是把 xxxx 的声明区分开来嘛,
EXT xxxx

使用特权

评论回复
地板
linjing| | 2010-4-15 21:53 | 只看该作者
一个是变量的“声明”,一个是变量的“定义”,搞清楚这两者的区别,这个问题也就清楚了

使用特权

评论回复
5
linjing| | 2010-4-15 21:55 | 只看该作者
具体点说,
int a; // 这是一个定义,在main文件中

extern int a; // 这是一个声明,在非main文件中

如果去掉extern,连接的时候会报错:变量重复定义

使用特权

评论回复
6
duanlang|  楼主 | 2010-4-15 22:11 | 只看该作者
明白了,谢谢

使用特权

评论回复
7
wangwo| | 2010-4-15 22:57 | 只看该作者
:),看看

使用特权

评论回复
8
冷漠| | 2010-4-16 10:44 | 只看该作者
这样做的好处就是可以在各个h文件中定义相应C文件中使用的变量,然后每个C文件都包含所有的C文件。



是不是:
这样做的好处就是可以在一个h文件中定义所有C文件中使用的变量说明,然后每个C文件都包含这个h文件。

使用特权

评论回复
9
ShakaLeo| | 2010-4-16 11:36 | 只看该作者
二楼笔误了,应该是“可以在各个h文件中定义相应C文件中使用的变量,然后每个C文件都包含所有的h文件。”
比如在a.c中#define a;
在a.h中
#ifndef a   
    #define EXT extern
#else
    #define EXT
#endif

    EXT int var1;

在b.c中#define b;
在b.h中
#ifndef b   
    #define EXT extern
#else
    #define EXT
#endif

    EXT int var2;

在a.h中定义a.c用到的变量,在b.h中定义b.c用到的变量,然后a.c和b.c都包含a.h和b.h这两个头文件。

使用特权

评论回复
10
chenxu_1| | 2010-4-16 11:41 | 只看该作者
应该是:这样做的好处就是可以在各个h文件中定义所有C文件中使用的变量说明,然后每个C文件都包含所有的h文件。

使用特权

评论回复
11
duanlang|  楼主 | 2010-4-16 22:24 | 只看该作者
原来各位都遇到过类似的问题,我看了谭浩强c程序设计的外部变量部分,就全明白了,大家不妨也翻翻书,或许有新的认识。

使用特权

评论回复
12
冷漠| | 2010-4-17 10:34 | 只看该作者
本帖最后由 冷漠 于 2010-4-17 10:39 编辑

LZ和11楼能不能给我讲详细些?功德无量。现在远离了学校图书馆,翻谭浩强也不方便了。

9、10楼讲的意思是:假设我一个项目有10个.C模块,那么每个模块前面至少有9个(10个)
#include  xx1.h
#include  xx2.h
#include  xx3.h
#include  xx4.h
......
#include  xx10.h

?  多吗?如果是几十个模块的软件,本模块所需外部变量定义怎么查找?

另:
假定:a.c要用到b.c中的一个变量 int bbb;
那么在b.h 定义 int bbb;
在a.h中定义 extern  int  bbb;

9楼10楼的意思是:
a.c 和 b.c    2个模块中都要包含下面2个头文件:
#include "a.h"
#include "b.h"

a.c 、b.c 前面成了:
int bbb;
extern  int  bbb;

???.盼望11楼给我这样初学者讲解,解惑。

使用特权

评论回复
13
epsmc| | 2010-4-17 15:18 | 只看该作者
#include "my.h"
#ifdef   GLOBAL
#define  INIT_EXT
  const unsigned char motor_TAB[]={0x1A,0x30,0x35,0x20,0x2A,0x00,0x05,0x10};
//=================================
#else
extern const unsigned char motor_TAB[];
#define  INIT_EXT extern
#endif
//===========================================================
//================        global variable      ==============
//===========================================================
INIT_EXT  unsigned char prin_status,delay_status;
INIT_EXT  unsigned char delay_status,delay_num;
INIT_EXT  unsigned char paper_out_num;
INIT_EXT  unsigned char normal_num,error_num,flash_num;
INIT_EXT  unsigned char new_motor_code,last_motor_code;
INIT_EXT  unsigned char  new_key_code,key_code,key_count;
INIT_EXT  unsigned char Y_motor_point,W_motor_point,V_motor_point;
INIT_EXT  unsigned char motor_Y_steps,motor_up_steps,motor_down_steps;
INIT_EXT  unsigned int num_J4,num_R4,num_R8,num_J8;
INIT_EXT  unsigned int pulse_num,wash_step;
INIT_EXT  unsigned int reset_step;

struct struc
{
        unsigned keyflag:           1;
        unsigned keyflag0:           1;
        unsigned in_flag:                1;
        unsigned out_flag:                1;
        //unsigned opt_F_flag:        1;                                                //back opt sensor
        unsigned flash_flag:        1;
        unsigned wash_flag:                1;
       
};
INIT_EXT struct struc struc_flag;  


//===========================================================
//===============       function declare       ==============
//===========================================================
INIT_EXT void init(void);
INIT_EXT void port_init(void);
INIT_EXT void timer0_init(void);
INIT_EXT void timer1_init(void);
INIT_EXT void uart0_init(void);
INIT_EXT void init_devices(void);
INIT_EXT void reset(void);


//=================                key                =================
INIT_EXT void key_scan(void);
INIT_EXT void key_process(void);
这样所有文件都只要包含同一个头文件,只在某一个C文件中#define GLOBAL
对做单片机文件管理十分方便

使用特权

评论回复
14
duanlang|  楼主 | 2010-4-18 11:09 | 只看该作者
其实就是这样,在一个c文件中(一般是包含main()函数的文件)先定义所有的变量,然后对于其他的c文件,因为已经定义过了,所以就是声明外部变量了。声明和定义都是在文件开头包含同一个头文件。

使用特权

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

本版积分规则

5

主题

17

帖子

1

粉丝