在定义中使用 static 关键字与在 C 中使用声明

2024-03-16

以下编译良好,使用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 标准的引用显示了差异)6.2.2 标识符的链接)

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

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

现在根据以下引用

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

因此,由于该函数的初始声明带有存储说明符 static,因此该函数具有内部链接。

至于变量的标识符

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在定义中使用 static 关键字与在 C 中使用声明 的相关文章

随机推荐