将全局变量的作用域限制在C中的一个文件内
我有两个将全局变量的作用域限制在C中的一个文件内,c,scope,C,Scope,我有两个.c文件,例如mylib.c和main.c和一个头文件mylib.h。其主要思想是创建全局静态数组,我可以从Main.c定义该数组的大小,但它可以从mylib.c访问,并且不能在Main.c中访问。我目前拥有的代码: mylib.c: \define\u MYLIB\u C_ #包括“mylib.h” 外部字符my_数组[]; 无效测试() { //正在使用我的_数组执行某些操作。。。 } 主要条款c: #定义我的数组大小128 #包括“mylib.h” void main() { t
.c
文件,例如mylib.c
和main.c
和一个头文件mylib.h
。其主要思想是创建全局静态数组,我可以从Main.c
定义该数组的大小,但它可以从mylib.c
访问,并且不能在Main.c
中访问。我目前拥有的代码:
mylib.c:
\define\u MYLIB\u C_
#包括“mylib.h”
外部字符my_数组[];
无效测试()
{
//正在使用我的_数组执行某些操作。。。
}
主要条款c:
#定义我的数组大小128
#包括“mylib.h”
void main()
{
test();
}
mylib.h:
\ifndef\u MYLIB\H_
#定义_MYLIB_H_
无效试验();
#ifndef_MYLIB_C_
char my_数组[my_数组大小];
#endif/*\u MYLIB\u C\u*/
#endif/*\u MYLIB\u H\u*/
所以,问题是:“我可以限制
my_数组的范围,使它在main.c
中不可见吗?”不,你不能。任何文件都可以轻松地声明并使用此变量。在头文件中添加extern yourGlobal
,然后在其中一个文件中声明yourGlobal(我上次使用它已经有一段时间了,但在任何情况下都要查找关键字“extern”),这样您就可以在使用头文件的任何文件中使用它。
声明另一个头减号以限制它如果您想使我的数组
仅在mylib.c中可见,则需要在该文件中将其定义为静态
,而不在头文件中放入任何内容
因此,mylib.c应该包含:
static char my_array[MY_ARRAY_SIZE];
而mylib.h根本不应该列出这个变量。这并不意味着我的数组大小
需要在mylib.c中可见。我找到了一个解决方法:
\ifndef\u MYLIB\H_
#定义_MYLIB_H_
无效试验();
#ifndef_MYLIB_C_
char my_数组[my_数组大小];
#定义我的_数组0
#endif/*\u MYLIB\u C\u*/
#endif/*\u MYLIB\u H\u*/
我只是在数组声明之后用零来重新定义它的名称。因此,如果有人试图在main.c
中使用该名称,他显然会遇到编译器错误。但是在mylib.c
中仍然一切正常。总比什么都没有好。我不确定你的情况是什么,但是如果有一个函数可以动态分配数组,这样就不需要从main.c
访问数组,那不是更好吗?将数组移动到只包含在main.c中的头。也许我应该提到,但我不能使用动态内存分配。无论如何,如果是你的代码,就不要使用那个变量。如果它要放在类库中,请在名称前加下划线,不要记录它的存在。“全局静态数组”就像说“方形圆”。当然,static
说明符仅通过文件范围限制变量的可见性。但是绝对没有办法使MY_ARRAY\u SIZE
在mylib.c
中可见,因为它只是由预处理器定义的整数文本,必须在main.c
@AleksandrNagaev中定义。那么,您别无选择:必须使用动态分配。您需要在mylib.c中公开一个函数,该函数接受数组的大小并为数组分配空间。@AleksandrNagaev或者,将MY_array\u size
放在一个单独的头文件中,并将其包含在mylib.c和main.c中,假设您可以一起编译它们。mylib.c
将在静态库中编译,mylib.h
必须提供使用它的接口MY_ARRAY_SIZE
只是我希望用户可以定义的一个参数。我不能使用动态分配,因为我希望该库能够在内存非常有限的不同类型的微控制器中使用。实际上,MY_数组大小在编译时总是已知的,所以不必使用动态分配。@AleksandrNagaev那么你需要给它一些固定大小,对于任何想使用它的人来说都足够大。