Keil C下 如何实现在一个头文件里声明的变量和函数 可以在多个C文件中使用

时间:2022-09-30 19:14:53
以前我都是用是哨兵的 可是我发现 哨兵在KEIL下好象没用 它仍然提示我有N多变量重复声明

该怎么做呢?

9 个解决方案

#1


哨兵沒用過﹐介紹一下嗎﹖

#2


就是一个条件编译的简单逻辑

#ifndef _head_h_
#define _head_h_
/*
这里的代码只被便宜器编译一次
*/
#endif

#3


宏汇编

#4


为什么不可以重复声明?

声明(declaration)好像本来就可以重复的吧?

#5


楼上,难道可以重复声明函数吗?

#6


// 在.h里面,只写声明:
// 例如在一个叫 "global.h"里面,这样写
extern int global_1;
extern int global_2;
int my_function(int arg);
//.....

// 如果有 struct 和 class 的定义,用条件语句:
#if !defined MY_STRUCT
#define      MY_STRUCT

struct my_struct {
int i;
int * p;
// ....
};

#endif

extern struct my_struct st1;

// 这样的头文件可以方便的使用,不会有重复定义错误

// 在"globals_c.c"
// 所有的变量定义都在".c"里面
int global_1;
int global_2;
struct my_struct st1;

int my_function(int arg)
{
// ....
}

#7


变量要在头文件中声明,有两个方法:使用 static 限定;使用 extern 。
如果使用 static, 则还是需要用到 #ifndef......,变量只在包含该头文件的 C 文件中可见。如果多个 C 文件都包含该头文件,虽然变量名称相同,但实际空间不同。
如果使用 extern 声明,则变量是全局变量,还需要在某个 C 文件中实际声明。

#8


以前我搞VC++开发,后来转到这方面做,发现弹片级的C语言和VC里面的一些语法还是有一些不同的,在一些编译器里面,似乎变量只能定义在C文件里(在C文件里实际分配存储空间),而其他的模块想要引用这些变量的话,可以生成一个h文件,用extern前缀来声明这些变量,之后只要包含这些h文件即可,如下
main.c文件
……
int gCommuErrCnt;
……

General.h文件中
#ifndef GENERAL_H
#define GENERAL_H
……
extern int gCommuErrCnt;
……
#endif

commu.c文件中
#include "general.h"
……
void WhenTelErr()
{
gCommuErrCnt++;
}
……
……

#9


单独用一个.H文件外部声明,需要引用的地方include就行了

#1


哨兵沒用過﹐介紹一下嗎﹖

#2


就是一个条件编译的简单逻辑

#ifndef _head_h_
#define _head_h_
/*
这里的代码只被便宜器编译一次
*/
#endif

#3


宏汇编

#4


为什么不可以重复声明?

声明(declaration)好像本来就可以重复的吧?

#5


楼上,难道可以重复声明函数吗?

#6


// 在.h里面,只写声明:
// 例如在一个叫 "global.h"里面,这样写
extern int global_1;
extern int global_2;
int my_function(int arg);
//.....

// 如果有 struct 和 class 的定义,用条件语句:
#if !defined MY_STRUCT
#define      MY_STRUCT

struct my_struct {
int i;
int * p;
// ....
};

#endif

extern struct my_struct st1;

// 这样的头文件可以方便的使用,不会有重复定义错误

// 在"globals_c.c"
// 所有的变量定义都在".c"里面
int global_1;
int global_2;
struct my_struct st1;

int my_function(int arg)
{
// ....
}

#7


变量要在头文件中声明,有两个方法:使用 static 限定;使用 extern 。
如果使用 static, 则还是需要用到 #ifndef......,变量只在包含该头文件的 C 文件中可见。如果多个 C 文件都包含该头文件,虽然变量名称相同,但实际空间不同。
如果使用 extern 声明,则变量是全局变量,还需要在某个 C 文件中实际声明。

#8


以前我搞VC++开发,后来转到这方面做,发现弹片级的C语言和VC里面的一些语法还是有一些不同的,在一些编译器里面,似乎变量只能定义在C文件里(在C文件里实际分配存储空间),而其他的模块想要引用这些变量的话,可以生成一个h文件,用extern前缀来声明这些变量,之后只要包含这些h文件即可,如下
main.c文件
……
int gCommuErrCnt;
……

General.h文件中
#ifndef GENERAL_H
#define GENERAL_H
……
extern int gCommuErrCnt;
……
#endif

commu.c文件中
#include "general.h"
……
void WhenTelErr()
{
gCommuErrCnt++;
}
……
……

#9


单独用一个.H文件外部声明,需要引用的地方include就行了