【问题标题】:Restrict scope of global variable inside one file in C限制C中一个文件内全局变量的范围
【发布时间】:2020-04-03 13:51:25
【问题描述】:

我有两个.c 文件,例如mylib.cmain.c 和一个头文件mylib.h。主要思想是制作全局静态数组,我可以从main.c 定义它的大小,但它可以从mylib.c 访问,而不能在main.c 访问。我目前拥有的代码:

mylib.c:

#define _MYLIB_C_
#include "mylib.h"

extern char my_array[];

void test()
{
    // Doing something with my_array...
}

main.c:

#define MY_ARRAY_SIZE 128
#include "mylib.h"

void main()
{
    test();
}

mylib.h:

#ifndef _MYLIB_H_
#define _MYLIB_H_

void test();

#ifndef _MYLIB_C_

char my_array[MY_ARRAY_SIZE];

#endif /* _MYLIB_C_ */
#endif /* _MYLIB_H_ */

所以,问题是:“我可以限制my_array 的范围以使其在main.c 中不可见吗?”

【问题讨论】:

  • 我不知道你的情况是什么,但是有一个动态分配数组的函数不是更好,这样就不需要从main.c访问数组了吗?
  • 将您的数组移动到仅包含在 main.c 中的标头。
  • 也许我应该提到这一点,但我不能使用动态内存分配。
  • 无论如何,如果这是您的代码,请不要使用该变量。如果它打算放在图书馆之类的地方,请在名称前加下划线,不要记录它的存在。
  • “全局静态数组”就像是在说“方圆”。

标签: c scope


【解决方案1】:

如果您想让my_array 仅在mylib.c 中可见,则需要在该文件中将其定义为static,并且不要在头文件中添加任何内容。

所以 mylib.c 应该包含:

static char my_array[MY_ARRAY_SIZE];

mylib.h 根本不应该列出这个变量。这并不是说MY_ARRAY_SIZE 需要在 mylib.c 中可见。

【讨论】:

  • 当然,static 说明符仅通过文件范围限制变量的可见性。但是绝对没有办法让MY_ARRAY_SIZEmylib.c 中可见,因为它只是由预处理器定义的整数文字,必须在main.c 中定义。
  • @AleksandrNagaev 那么你别无选择:你必须使用动态分配。您需要在 mylib.c 中公开一个函数,该函数获取数组的大小并为数组分配空间。
  • @AleksandrNagaev 或者,将 MY_ARRAY_SIZE 放在单独的头文件中,并将其包含在 mylib.c 和 main.c 中,假设您可以一起编译它们。
  • mylib.c 将编译到静态库中,mylib.h 必须提供接口才能使用它。 MY_ARRAY_SIZE 只是我希望用户可以定义的一个参数。我不能使用动态分配,因为我希望该库用于内存非常有限的不同类型的微控制器。实际上,MY_ARRAY SIZE 在编译时总是已知的,因此没有必要使用动态分配。
  • @AleksandrNagaev 然后你需要给它一些固定的大小,对于任何想要使用它的人来说都足够大。
【解决方案2】:

不,你不能。任何文件都可以轻松声明并使用该变量。

【讨论】:

    【解决方案3】:

    在您的标题中添加extern yourGlobal,然后只需在其中一个文件中声明yourGlobal(我上次使用它已经有一段时间了,但无论如何都要查找关键字'extern'),这样您就可以在使用标题的任何文件中使用。 声明另一个 header whitout 来限制它

    【讨论】:

      【解决方案4】:

      我找到了解决方法:

      #ifndef _MYLIB_H_
      #define _MYLIB_H_
      
      void test();
      
      #ifndef _MYLIB_C_
      
      char my_array[MY_ARRAY_SIZE];
      #define my_array 0
      
      #endif /* _MYLIB_C_ */
      #endif /* _MYLIB_H_ */
      

      我只是在声明后将数组的名称重新定义为零。因此,如果有人尝试在main.c 中使用该名称,他显然会遇到编译器错误。但是在mylib.c 中仍然一切正常。有总比没有好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2016-11-13
        • 2010-10-07
        • 2014-05-10
        • 2010-11-06
        • 2017-03-05
        • 1970-01-01
        相关资源
        最近更新 更多