【问题标题】:why this error has come ? "static declaration of function follows non-static declaration"? [duplicate]为什么会出现这个错误? “函数的静态声明遵循非静态声明”? [复制]
【发布时间】:2018-05-15 09:06:07
【问题描述】:

我正在学习静态函数,如果我将函数声明为 一个静态函数,然后我无法将此函数访问到其他 c 文件中,如果我尝试访问,那么应该有一个错误“undefined reference to `fun” 所以我在 add.c 和 add.h 文件中声明并定义静态函数并将该函数调用到 main.c 文件中,但我得到不同的错误,即“'fun'的静态声明遵循非静态声明"强文本 所以我的问题是为什么会出现这个错误???? 请原谅我的英语不好!!!!

/************** main.c****************/
    #include <stdio.h>
    #include <stdlib.h>
    #include "add.h"

    int main(void)
    {
      printf("%d ", fun());
      printf("%d ", fun());
      return 0;
    }

/***************add.c*************/

    #include <stdio.h>
    #include "add.h"

    static int fun(void)
    {
      int a=5,b=4;
      return a+b;
    }

/*********************add.h*************/

    #ifndef ADD_H_
    #define ADD_H_

    static int fun(void);

    #endif /* ADD_H_ */

【问题讨论】:

  • 由于静态函数是文件本地的,所以将静态函数声明放在头文件中是没有意义的。在这种情况下,如果您想从main.c 调用它,则不能将add.c 中的fun 设为静态。不同的文件,对吧?所以决定:(a)静态,仅一个文件,不在头文件中,或(b)非静态,在头文件中,可从任何文件调用。选择。
  • 嘿,汤姆,感谢您理解这一点!!!!
  • 我很想重新打开这个问题,因为它不是声称的原件的副本。这个问题询问为什么 OP 会收到一条错误消息,指出“函数的静态声明遵循非静态声明”,而这在原文中没有解释。但是,问题中的代码似乎不应该生成该消息,因此代码和问题之间可能存在不匹配。该问题应该以不同的原因得到澄清或结束,例如不再可重复或不清楚您在问什么。

标签: c static-functions


【解决方案1】:

静态变量或函数只能在声明它的文件中看到。

C11 标准

6.2.2.3

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多