【问题标题】:Scope of Function access in CC中函数访问的范围
【发布时间】:2016-04-04 22:55:54
【问题描述】:

假设我有一个我想在内部使用的函数,例如 Java 或 C++ 中的 private,但我正在用 C 编写。在这种情况下,我有一个头文件和一个 c 文件实现以及 @ 987654323@ 文件有几个最终用户不应该使用的功能。我可以不在头文件中声明这些函数以防止访问它们,还是这是不好的做法/有更好的方法吗?

【问题讨论】:

  • 这正是静态函数的用途。

标签: c function scope


【解决方案1】:

制作这样的内部函数static并将其保存在.c文件中。

static functions:

如果一个函数只能在声明它的文件中被调用,那么将它声明为一个静态函数是合适的。当函数被声明为静态时,编译器现在将编译为目标文件,以防止从其他文件中的代码调用该函数。

或者在 C 标准中:

6.2.2 标识符的链接
...
如果对象或函数的文件范围标识符的声明包含存储类 说明符static,标识符有内部链接。1


1 一个函数声明只能在文件范围内包含存储类说明符 static ....

【讨论】:

    【解决方案2】:

    直接在.c文件中将这些函数声明为静态函数,并在同一个文件中提供函数的定义:

    Ì在 .c 文件中:

    static void internal_func1(void);
    static int interal_func2(int a);
    
    static void internal_func1(void)
    {
       /* body of internal_func1 */
    }
    
    static int interal_func2(int a)
    {
       /* body of internal_func2 */
    }
    

    添加static 关键字使这些函数对其他源文件不可见(函数标识符将具有内部链接)。

    【讨论】:

      【解决方案3】:

      这就是你在这种情况下要做的,并将静态添加到声明的函数中。您可以在 .h 文件中声明您的公共函数,在 .c 文件中声明私有函数。

      假设您有一个 .h 和 .c 文件:

      SomeFile.h

      void doSomething1(void);
      void doSomething2(void);
      

      SomeFile.c

      static void doSomething3(void);
      static void doSomething4(void);
      //These functions can be called by anyone
      void doSomething1(void)
      {
          //function guts here
      }
      void doSomething2(void)
      {
          //function guts here
      }
      //These functions can only be called inside this file
      static void doSomething3(void)
      {
          //function guts here
      }
      static void doSomething4(void)
      {
          //function guts here
      }
      

      【讨论】:

      • 一个函数(或任何一般名称)如果在后者之前使用,则只需要与其定义分开声明。通常的做法是在使用前定义它们。这避免了冗余(对于具有外部链接的名称,这是无法避免的)。
      【解决方案4】:

      是的,可以使头文件中的某些功能不可用。

      其他选项是将头文件分成2个。一个供内部使用,另一个供外部用户使用。

      除此之外,您还可以将函数声明为静态,使其在文件范围之外不可见

      【讨论】:

        猜你喜欢
        • 2021-10-16
        • 2016-09-27
        • 1970-01-01
        • 2020-05-31
        • 2012-08-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 2015-02-06
        相关资源
        最近更新 更多