【问题标题】:static functions in multiple files [closed]多个文件中的静态函数[关闭]
【发布时间】:2014-12-04 01:27:49
【问题描述】:

我正在尝试将一个 c 程序分解为两个不同的文件。我正在使用静态函数,我想知道这将如何影响我向两个文件的转换。我希望我的所有函数都在一个文件中,而所有调用都在另一个文件中。使用静态函数需要做什么是两个不同的文件?

【问题讨论】:

  • 你考虑过不使用静态函数吗?
  • 静态函数具有“内部链接”——它们保留在声明它们的文件中。您可以在多个文件中定义相同的静态函数,但更好的解决方案取决于您的详细信息问题。
  • 似乎没有人提到的是,#include 一个 C 文件到另一个 C 文件中没有任何问题。我这样做是为了在特定情况下保持函数静态,同时保持文件大小可管理。 (如果你不喜欢这样,好吧,这是一个宗教论点,而不是编程论点。)

标签: c function static


【解决方案1】:

静态意味着对其他文件不可见。请学习基础知识。

【讨论】:

  • 我以为这就是我正在做的事情
  • C 中的静态函数和 C++ 中的静态成员函数有很大的不同。在 C 中,静态函数在其编译单元之外是不可见的,它是编译成的目标文件。换句话说,将函数设为静态会限制其范围。您可以将静态函数视为其 *.c 文件的“私有”函数(尽管这并不完全正确)。
  • 在 C++ 中,“静态”适用于类的成员函数和数据成员。静态数据成员也称为“类变量”,而非静态数据成员是“实例变量”。这是 Smalltalk 术语。这意味着只有一个静态数据成员的副本由类的所有对象共享,而每个对象都有自己的非静态数据成员副本。所以静态数据成员本质上是一个全局变量,是一个类的成员。
  • 非静态成员函数可以访问类的所有数据成员:静态和非静态。静态成员函数只能对静态数据成员进行操作。
  • 更好,但还不够。列出有关“静态”的图书数据不会解决您的问题。在 C 和 C++ 中,应用于函数的 static 关键字会导致函数具有内部链接。这是实现封装的C方式。因此调用静态函数并请求从另一个翻译单元调用它是一个悖论。在最坏的情况下,您至少需要 1 个非静态入口点,但一般情况下,任何函数都不应该是静态的。
【解决方案2】:

C语言中静态函数的链接只在一个文件中,所以你可以调用不同源文件中的静态函数。 所以你可能需要这个

在交流中

int bar(){return 1;}

int b.c 将调用 bar 函数

int bar(); /*declaration the function type*/
void foo(){bar();} /* just call it*/

【讨论】:

    【解决方案3】:

    最稳健的解决方案是首先在头文件中声明“全局可见”函数,然后将此头文件包含在定义或引用该函数的所有函数中。


    app.h:

    #ifndef _APP_H    //why this? left as an excercise for the reader ;-)
    #define _APP_H
    ...
    //declare fun()
    extern   int   fun(char * strArg);
    ...
    #endif
    

    def.c:

    #include "app.h"
    //define fun()
    int   fun(char * strArg)
    {
       ....
    }
    

    ref.c:

    #include "app.h"
    ....
    //reference fun()
    int ret = fun("this is a test");
    ....
    

    ===========

    这样可以确保所有对 fun() 的引用都正确调用它。 如果你碰巧以任何方式改变了 fun() ,或者错误地调用了它, 编译器会告诉您需要在哪里进行所有更改/修复。

    在任何情况下,如果您希望任何内容在特定源文件之外可见,则最好不要具有“静态”属性。 因为静态属性的目的是使静态的东西在源文件之外不可见。

    ========

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多