c语⾔struct要什么头⽂件,[转载]怎样在C语⾔中⽤H头⽂件声明
⼀个外部struct变量...
怎样在C语⾔中⽤H头⽂件声明⼀个外部变量
要定义⼀个struct变量,⾸先要定义⼀个结构体变量类型名 即struct
结构体名
例如定义⼀个按键属性结构体(包含 是否有按键值更新(renew)和按键值(num)两个成员)
struct Key_attribute
{
unsigned char renew;
unsigned char num;
};
到此只是定义了⼀个类型名为 struct
Key_attribute的结构体变量类型,仅仅是定义了⼀个类型⽽已,不⽣成代码,它的的属性和 int
,char,⼀样,只是⼀个类型说明。
有了类型之后就可以像 int i;定义i为⼀个整型变量⼀样,利⽤刚刚声明过的结构体变量类型struct
Key_attribute 定义⼀个类型属性如struct
Key_attribute(包含 两个unsigned char ⽆符号字符型变量 成员)的结构体变量了。
如 struct Key_attribute Key;//就定义了Key
为⼀类型为struct attribute 的结构体变量 此时Key 就会产⽣代码,占⽤内存了。
具体应⽤如下:
在KEY.H头⽂件中声明Key为⼀外部结构体变量
#ifndef _KEY_H_
#define _KEY_H_
。。。。
struct Key_attribute//定义⼀个名为 struct
Key_attribute 的结构体类型。类型属性为包含两个⽆符号字符型变量成员
{
unsigned char renew;
unsigned char num;
};
//到此就定义好 struct
Key_attribute 类型了,只要C⽂件中包含 "KEY.H"就可以直接像⽤ int 定义变量⼀样,定义struct
Key_attribute 类型的结构体变量了
/
/如果 file1.c中包含 "KEY.H" 并定义了 struct
Key_attribute Key;则只要在"KEY.H"⽂件中⽤⼀条外部变量声明 extern
c语言struct用法例子struct Key_attribute Key,其它⽂件只要包含"KEY.H"就可以对结构体变量Key进⾏操作了。
extern struct Key_attribute
Key; //声明变量Key 为⼀属性为struct
Key_attribute的外部结构体变量,任何包含"KEY.H"都可以不⽤再次声明Key为外部变量⽽直接使⽤结构体变量Key 了。
//这样做的好处是,如果在头⽂件⾥⾯定义变量则编译器会为调⽤头⽂件⾥的同⼀变量的不同⽂件分配不同的存储空间,造成存储空间浪费。所以⼀般只在头⽂件⾥声定义变量类型,或声明变量为外部变量,⽽不定义变量。
。。。。
#endif
/
/------------------------------------------------------------------------
分清声明和定义:
例如:
//ta.c
extern int a; //声明
//tb.c
extern int a; //声明
//tc.c
extern int a; //声明
void changa(void) { ++a; //a在别处有定义 }
//td.c
#include "ta.c "
#include "tb.c "
#include "tc.c "
#include
int a = 0; //此处定义a int main(void)
{
changa();
printf( "a = %d ",a);
return 0;
}
//------------------------------------------------------------------------
C语⾔头⽂件中定义变量问题
头⽂件重复包含问题,问题描述如下:
他在程序中建⽴了⼀个global.h的⽂件,代码如下:
#ifndef
_GLOBAL_H_
#define
_GLOBAL_H_
int a;
int b;
int c;
然后在其他⽂件代码中,有多个.cpp⽂件引⽤他,编译的时候编译器报变量重复定义。
其实这是个C语⾔的基本问题,如果学过编译原理的⼈就很清除问题在哪⾥。假设上⾯的头⽂件global.h,有三个.cpp⽂件,1.cpp,
2.cpp,
3.cpp都包含了这个头⽂件。那么在编译的时候分别⽣成 1.obj, 2.obj,
3.obj。在这三个obj⽂件中都包含变量a, b,
c。那么在链接的时候你让机器怎么去分别三个a变量,三个b变量,三个c变量,那么就只好给你报个错了。
不过,如果是从事Linux或者以前标准C语⾔开发的⼈可能会想,我原来编程就是这么编的,怎么就没有报错。对的,有些编译器是具有这种重定义⾃动检测的,如Linux下C编程。我⽬前⽤的编程环境是Visual
studio 2003。我写了两个⼩程序测试了⼀下,⼀个是标准C程序,如下:
head1.h
#ifndef _HEADER1_H_
#define _HEADER1_H_
void print_1();
#endif
head2.h
#ifndef _HEADER2_H_
#define _HEADER2_H_
void print_2();
#endif
global.h
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
int g_test;
#endif
head1.c
void print_1()
{
g_test=1;
printf("%dn",g_test);
}
head2.c
void print_2()
{
g_test=2;
printf("%dn",g_test);
}
main.c
void main()
{
print_1();
print_2();
}
经过测试,这种⽅式是对的。
然后,我写了段c++代码,程序代码和上⾯的⼀模⼀样,就是.c⽂件变成了.cpp⽂件。结果就报重定义的错误。
由此可见,这个问题是C++新标准。⽽上述标准C能够编译过,说明这种对重定义的⽀持是依据编译器的,但是对于编译器来说,不是必须的。所以程序员写程序最好不要⽤上述代码写,现在⼀般程序员对这个问题流⾏的写法是如下:
#ifndef
_GLOBLE_H #define _GLOBLE_H extern int a; extern int b; extern int c; #endif 然后在其他的某个.cpp⽂件中定义
int a;
int b;
int c;
但是这种写法在具有⼤量的变量时候,容易造成声明的头⽂件和变量定义的cpp⽂件中变量的不⼀致。
下⾯是我给出⼀个的解决⽅法。
定义⼀个宏,如:MAIN,在global.h中,加⼊如下代码:
#ifdef MAIN
#define
EXTERN //定义变量
#else
#define EXTERN
extern //声明变量
#endif
EXTERN int a;
EXTERN int b;
EXTERN int c;
然后在你的1.cpp
,
2.cpp , 3.cpp
中,在其中的⼀个.cpp中
#define MAIN
#include
"gloabl.h"
进⾏定义。这样相当于对gloabl.h中的变量进⾏定义。
⽽在其他的cpp中,如需要引⽤global.h中的变量,则
#include
"gloabl.h"
⽽不需要#define
MAIN.或者将#define MAIN定义在#include
"gloabl.h"的后⾯。这样编译的时候就会将gloabl.h中的变量作为声明来看待。
这样即使变量再多,也不会出现头⽂件和CPP⽂件中的变量不符。因为所有的变量只需在⼀个⽂件中写⼊。
//------------------------------------------------------------------------
PS:⾸先,尽管⼀个全局变量或函数可以(在多个编译单元中)有多处“声明”,但是“定义”却只能允许出现⼀次。定义是分配空间并赋予初值(如果有)的声明。最好的安排是在某个相关的.c⽂件中定义,然后在头⽂件(.h)中进⾏外部声明,在需要使⽤的时候,只要包含对应的头⽂件即可。定义变量的.c⽂件也应该包含该头⽂件,以便编译器检查定义和声明的⼀致性。
作为⼀般规则,你应该放在头⽂件(.h)中的有:
宏定义(预处理#defines)
结构、联合、和枚举声明
typedef声明
外部函数声明
全局变量声明
当声明或定义需要在多个⽂件中共享时,尤其需要把它们放在头⽂件中。特别是,永远不要把外部函数原型放到.c⽂件中。如果定义或声明为⼀个.c⽂件私有,则最好放在.c⽂件中。
另外:#incluse<>语法通常⽤于标准或系统提供的头⽂件,⽽#include""通常⽤于程序⾃⼰的头⽂件。通常在搜索时,由#incluse<>包含的头⽂件会现在⼀个或多个标准位置搜索,⽽⽤#incluse""包含的头⽂件会⾸先在“当前⽬录”中搜索,然后(如果没有到)再在标准位置搜索。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论