关于keil多c文件工程中bit变量的声明定义问题

为了这个问题,浪费好长时间,挤进了脑汁,伤透了脑筋,曾一度有个现在看来应该是挺好笑的想法——怀疑keil不向标准c一样,不能很好的支持多c文件工程,在多c文件共享变量时,尚无法很好处理。

    不过就在要点发送帖子按的一瞬间,偶却有了灵感,并通过验证,知道如何解决了。然后再接着想下去,通过实验,有个更多收获:

    1)如果两个或更多c文件都需要使用某非bit型变量,那么声明是应将相应存储类型同时注明,即如果定义“uchar idata cntembuf;”,那么应声明为“extern uchar idata cntembuf;”或者“extern idata cntembuf;”;

    2)如果是bit型变量,则数据类型“bit”必须注明,而存储类型可以省略;

    LN认为,keil里之所以将bit变量和其他类型变量分开处理,是keil面向的处理器都是51内核的,而51内核bit变量只存在于特殊功能寄存器和内存的位寻址区(bdata区),而特殊功能寄存器中的位变量若在两个以上文件中使用各各文件都只能用类似于sbit abcd = P1^6;的形式进行声明,并且keil不检测abcd这个位变量在不同文件中是否代替相同位(例如,可以在另一个c文件中声明为:sbit abcd = P0^5;等),这样一来,用extern声明的bit变量就只有在bdata区了,所以,允许在在一个c文件中定义位变量后,在其它c文件中省略“bdata”这个存储类型;

而非bit型变量则可以在特殊功能寄存器,内存,外存,所以声明时要使存储类型与定义时的存储类型相同(也可以在定义和声明时都不规定存储类型,而又编译器根据编译模式自动分配)。

   

    感觉今天这事真有点搞笑,不过说明:交流是非常有用的。因为尽管帖子未能发出,但是在要跟他人交流时,人会不自觉的将所要描述给他人的问题屡一下头绪,而往往就这么一屡,可能就让自己有了办法。当然很多时候怎么屡也不行,这时候就要靠别人直接教了。

 

 

                  LN的未发出的求救贴

老师,你好!
    我在使用keil编译多c文件工程时,发现一个问题:首先,我在main函数所在文件mainf.c中定义:“uchar idata cntfrqbuf[2];”和“uchar idata cntembuf=0;”;
然后,因为okuart.c同样要用到“cntfrqbuf[2]”和“cntembuf”,所以我在okuart.c中声明:“extern uchar cntfrqbuf[2];”和“extern uchar cntembuf;”;但是编译时,出现警告,并因此无法生成目标文件,提示如下:
*** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH
    SYMBOL:  CNTFRQBUF
    MODULE:  okuart.obj (OKUART)
*** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH
    SYMBOL:  CNTEMBUF
    MODULE:  okuart.obj (OKUART)
*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
    SYMBOL:  CNTEMBUF
    MODULE:  okuart.obj (OKUART)
    ADDRESS: 02EEH
*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
    SYMBOL:  CNTFRQBUF
    MODULE:  okuart.obj (OKUART)
    ADDRESS: 0306H
Program Size: data=130.5 xdata=0 code=2576
Target not created

因为这件事我已经浪费2天时间了,除了不采用多c文件工程的方法外,一直没有想到可行办法,但是,我非常想使用多c文件工程,感觉这样比较清晰易读。请问老师,我该怎样处理呢?非常感谢

你可能感兴趣的:(C)