前几天调试ZigBee程序时,由于要用到大局变量,所以在一个大局文件界说了两个大局变量,如下:
#ifndef _TC77_H_
#define _TC77_H_
BYTE GetTC77String( char *buffer );
unsigned char WATER_flag = 1;
unsigned char LIGHT_flag = 1;
#endif
不过编译后却呈现这样的过错:
Copyright (c) 2009 Microchip Technology Inc.
Error – could not find definition of symbol ‘LIGHT_flag’ in file ‘objects/TC77.o’.
Errors : 1
或许是由于在两个文件里一起调用了tc77.h这个文件的原因,不过我想不通的是已然有宏条件界说,为什么还会呈现重复界说的现象呢?
后来在网上查了一下,把界说改成如下方式就好了:
#ifndef _TC77_H_
#define _TC77_H_
BYTE GetTC77String( char *buffer );
extern unsigned char WATER_flag;
extern unsigned char LIGHT_flag;
#endif
并且,在这个头文件里边还不能进行赋初值。
并且,这两个变量还有必要在你要调用这个头文件的某个文件的前面在界说一遍,如下:
unsigned char WATER_flag = 1;
unsigned char LIGHT_flag = 1;
这样编译就成功,感觉怪怪。曾经也写过不少大型的程序,不过相似这样的问题也处理过,不过用这种办法仍是不多的。
下面是我从网上看到的阐明:
c/c++言语中有许多当地要用到extern,可是假如没有真实的了解它的含义,会给编程带来很大的费事,为了使咱们少走弯路,特祥细的阐明一下。
关于比较小的程序,一般只要一个c文件和一个头文件,大局变量咱们通常会直接界说在c文件中,在程序之前加int i界说。假如要在头文件中界说有以下两种办法:用extern来声明:extern int i;这一句仅仅对变量 i 进行声明,在c文件的程序之前有必要加上int i进行界说。extern int i=0;这一句声明和界说都做了。
关于大一点的程序,有许多c文件和头文件,这个时分大局变量就有必要在头文件中声明(不需求初始化),然后在一个c文件中界说(该初始化的要初始化)。假如在头文件中界说,则编译的时分会呈现重复界说的过错。假如只要头文件中声明就会呈现没有界说有正告。
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: K
MODULE: 222.obj (222)
呈现上述过错则是由于变量k重复界说,把你的头文件中的变量界说前加extern(仅仅变量声明不必初始化),再在某一个你要调用该变量的c文件的程序之前再界说(留意第一个调用的c文件要担任顺便初始化该变量,其他调用的c文件就不需求初始化进程啦)一下就可以了。