搜索
bottom↓
回复: 9

多函数使用的字符串应放在哪?

[复制链接]

出0入0汤圆

发表于 2012-8-18 15:44:01 | 显示全部楼层 |阅读模式
用模块化写程序,有一些字符串(譬如:10个)要被多个函数反复调用其中的一部分,且每次调用的数量不等,请问应在哪里定义?能否放在一个总的头文件中?如何写?谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-18 22:42:15 | 显示全部楼层
可以的。
定义头文件:
#ifndef __EXA_H__
#define __EXA_H__  
              

extern unsigned char TempData[10]; //存储显示值的全局变量

/*  可以添加其他的函数,以及变量 */


#endif

出0入0汤圆

 楼主| 发表于 2012-8-18 23:30:48 | 显示全部楼层
akion78 发表于 2012-8-18 22:42
可以的。
定义头文件:
#ifndef __EXA_H__

先谢谢您!!
可能是我没说清楚,我的意思是:有多个字符串,譬如:
uchar code menu0 []={"aaa"};
uchar code menu1 []={"bbb"};
uchar code menu2 []={"ccc"};
uchar code menu3 []={"ddd"};
uchar code menu4 []={"eee"};
uchar code menu5 []={"fff"};
这是我原来一个程序中的一部分menu,众多的menu供好几个函数分别调用。
现在想用模块化改写,就这样放在头文件中,试了,不行,放在某一个文件中,
然后每一个menu都用extern声明,看来也不是好办法,不知如何处理?

出0入42汤圆

发表于 2012-8-18 23:38:32 | 显示全部楼层
wh8010jky 发表于 2012-8-18 23:30
先谢谢您!!
可能是我没说清楚,我的意思是:有多个字符串,譬如:
uchar code menu0 []={"aaa"};

写在c中,h中extern一下就是个好办法。不是说每个h都extern,一个和c同名的h里面extern就可以了,别处只需要include这个h

出0入54汤圆

发表于 2012-8-18 23:40:48 | 显示全部楼层
wh8010jky 发表于 2012-8-18 23:30
先谢谢您!!
可能是我没说清楚,我的意思是:有多个字符串,譬如:
uchar code menu0 []={"aaa"};

那就用一个menu.c来统一管理menu,其他模块要进入或者退出menu全部调用menu.c的接口。

出0入0汤圆

 楼主| 发表于 2012-8-19 20:46:42 | 显示全部楼层
感谢各位关心本帖!我是这样试验的:
将 menu 组分别放在不同的地方编译时出现如下提示:
一、在main中:
1、函数体外:其他函数调用时:error c202 undefined identifier (未定义标识符)
2、函数体内:warning c280 unreferenced variable (不能引用的局部变量)

        所以:不能放在main中。

二、在某个函数中(譬如:Lcd12864)中:
1、c 函数体外:
    h 中:
     (1): 写成 extern uchar code menuX[]={"aaa"};
     error C279: 'menuX': multiple initialization (多重设初值)
     (2): 必须写成 extern uchar code menuX[];
     (3): 必须每个 menu 都 extern , 否则其他函数调用未 extern 的 menu 时:
          error c202 undefined identifier

        menu 很多,这样写很繁。

2、c 函数体内:warning c280 unreferenced variable    显然不行。

三、单独做成一个函数:
1、menu 组在函数体内:

    void menu()
    {
        所有的 uchar code menuX[]={"aaa"};语句
    }

       提示所有的 "menuX" : warning C280: unreferenced local variable

2、menu 组在函数体外:

    所有的 uchar code menuX[]={"aaa"};语句
    void menu()
    {}
    在 h 中对每一个 menu extern.

    编译时:警告 menu() 未使用。


综上所述:
    最后将 menu 组放在 12864.c 的函数体外,在 12864.h 中对每一个 menu extern.
          menu 项太多,很繁琐, 但是解决了问题。


          各位高手还有什么好办法?请继续指教!

出350入477汤圆

发表于 2012-8-19 22:07:28 | 显示全部楼层
本帖最后由 redroof 于 2012-8-19 22:12 编辑
wh8010jky 发表于 2012-8-19 20:46
感谢各位关心本帖!我是这样试验的:
将 menu 组分别放在不同的地方编译时出现如下提示:
一、在main中:

您是编程新手吧?
虽然C语言允许你编写任意混乱的程序,但建议按照常规的标准做法来做,不要自己发明一套。
下面的做法并非语法规定,而是大家通常的惯例做法,如无特别理由,只管照着做就行了:

按惯例每个C文件应当有一个同名的H文件,每个“模块”包括C文件和对应的H文件。
C文件存放实际的函数和数据,H用于存放本模块对外的接口(需要被本文件外部使用的函数和变量的extern声明)
需要被本模块外部使用的任何东西,都应当在H文件中用extern声明
仅被本模块内部使用的东西,可在C文件的头部声明(如定义在使用之前则无需声明)
H文件中不得有函数和变量的定义(但inline函数应当定义在H文件中),只能有类型定义,define,和extern声明
注意H文件按惯例要用
#ifndef  ABC_H
#define ABC_H         
......
#endif
包装起来(这里假设该文件叫ABC.H,头文件中的这个define标志应当是由自身文件名转换过来的),以防被人有意或无意的多次include
其他模块如需使用这个模块中的函数或变量,只要include该模块的H文件即可

出350入477汤圆

发表于 2012-8-19 22:19:27 | 显示全部楼层
wh8010jky 发表于 2012-8-19 20:46
感谢各位关心本帖!我是这样试验的:
将 menu 组分别放在不同的地方编译时出现如下提示:
一、在main中:

针对你的例子,惯例的做法如下:
在menu.h文件中:
#ifndef MENU_H
#define MENU_H
extern uchar code menu0 [];
extern uchar code menu1 [];
extern uchar code menu2 [];
extern uchar code menu3 [];
extern uchar code menu4 [];

#endif

在menu.c文件中:
uchar code menu0 []={"aaa"};
uchar code menu1 []={"bbb"};
uchar code menu2 []={"ccc"};
uchar code menu3 []={"ddd"};
uchar code menu4 []={"eee"};
uchar code menu5 []={"fff"};

在其他任何需要使用这些menu的文件中:
#include "menu.h"

一般建议尽量暴露函数作为接口,而不要暴露全局变量做接口。例如,这里建议把对菜单的操作函数抽象出来,集中到menu.c文件里面,这样或许就不需要把这么多菜单数组都extern出来了。

出0入0汤圆

 楼主| 发表于 2012-8-20 00:05:49 | 显示全部楼层
redroof 发表于 2012-8-19 22:19
针对你的例子,惯例的做法如下:
在menu.h文件中:
#ifndef MENU_H

您好!
      你所说的情况有一个问题不知注意到没有?就是我在“试验说明”三、中说的:1、如果各个menu[]都放在函数体内(就是在{}内),就会出现一大堆的警告:c280,       2、如果各个menu[]放在函数体外,就会出现 一个警告:"menu()"未使用,因为其他函数不需要调用menu(), 就可使用menu[].   我现在的写法是:将各个menu[]放在12864.c的函数体外,在12864.h中对每一个menu[]  extern , 之所以这样,一是可省略menu()函数及其头文件,二是menu[]要在12864上显示,放在一起也生在理。
      最后对您表示感谢!

出350入477汤圆

发表于 2012-8-20 08:35:19 来自手机 | 显示全部楼层
wh8010jky 发表于 2012-8-20 00:05 您好! 你所说的情况有一个问题不知注意到没有?就是我在“试验说明”三、中说的:1、如果各个menu ...

呵呵,怎么想到要弄一个没用的menu()空函数呢?
只被一个函数使用的变量,应当放在这个函数内部,被多个函数使用的变量应当放在函数外面,规则就是这么简单。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表