在定义中使用静态关键字,在C中使用声明

问题描述 投票:0回答:1

下面的编译很好,仅在函数声明期间使用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;
}

获取thew错误:non-static declaration of 'a' follows static declaration

有什么区别?

c static declaration extern linkage
1个回答
1
投票

C标准中的此引用显示了区别)6.2.2标识符的链接)

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

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

现在根据下面的引用

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

因此该函数具有内部链接。

然后是变量的标识符

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

以上引述的简历如下。如果函数没有明确指定的存储类说明符extern,则其链接由先前的函数声明(如果存在这样的声明)确定。至于对象的标识符,则在这种情况下具有外部链接。并且,如果预先声明了带有内部链接的标识符,则该行为是不确定的。

© www.soinside.com 2019 - 2024. All rights reserved.