Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将全局变量的作用域限制在C中的一个文件内_C_Scope - Fatal编程技术网

将全局变量的作用域限制在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那么你需要给它一些固定大小,对于任何想使用它的人来说都足够大。