【问题标题】:Using static keyword in definition vs declaration in C在定义中使用静态关键字与在 C 中声明
【发布时间】:2020-06-14 23:01:06
【问题描述】:

以下编译正常,仅在函数声明期间使用static

#include <stdio.h>

static int a();

int a(){
 return 5;
}

int main(){
 printf("%d\n", a());
 return 0;
}

附带说明,inline 函数会发生与上述相同的行为,即只有声明可以包含关键字。

但是以下失败了,但在一个变量上做同样的事情:

#include <stdio.h>

static int a;

int a = 5;

int main(){
 printf("%d\n", a);
 return 0;
}

出现以下错误: non-static declaration of 'a' follows static declaration.

有什么区别?

【问题讨论】:

    标签: c static declaration extern linkage


    【解决方案1】:

    C 标准中的这句话显示了区别)6.2.2 标识符的链接)

    5 如果函数标识符的声明没有 存储类说明符,它的链接是完全确定的,就好像它 使用存储类说明符 extern 声明。如果 对象标识符的声明具有文件范围,并且没有 存储类说明符,它的链接是外部的。

    所以一个函数看起来像它具有隐式存储说明符extern(但这并不意味着它具有与在这种情况下具有外部链接的对象标识符相反的外部链接)。

    现在根据下面的引用

    4 对于使用存储类说明符 extern 声明的标识符 在该标识符的先前声明的范围内 可见,31) 如果先前的声明指定内部或外部 链接,后面声明的标识符的链接是 与先前声明中指定的链接相同。 如果没有先前声明 声明是可见的,或者如果先前的声明指定没有 链接,则标识符有外部链接

    因此该函数具有内部链接,因为它的初始声明使用存储说明符 static。

    至于变量的标识符那么

    7 如果在一个翻译单元中,相同的标识符出现在两个 内部和外部链接,行为未定义。

    以上引用的简历如下。如果函数没有明确指定的存储类说明符extern,则其链接由先前的函数声明确定(如果存在这样的声明)。至于对象的标识符,那么在这种情况下它具有外部链接。如果事先声明了带有内部链接的标识符,则行为未定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 2012-06-04
      • 2013-08-04
      • 2021-06-21
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多