gpt4 book ai didi

c - m 的静态声明遵循非静态声明

转载 作者:太空狗 更新时间:2023-10-29 16:50:33 26 4
gpt4 key购买 nike

我正在尝试一个小例子来了解静态外部变量及其用途。静态变量是局部作用域,外部变量是全局作用域。

static5.c

#include<stdio.h>
#include "static5.h"
static int m = 25;
int main(){
func(10);
return 0;
}

static5.h

#include<stdio.h>
int func(val){
extern int m;
m = m + val;
printf("\n value is : %d \n",m);
}

gcc static5.c static5.h

对/对:

static5.c:3: error: static declaration of m follows non-static declaration
static5.h:3: note: previous declaration of m was here

已编辑

正确的程序:

a.c:
#include<stdio.h>
#include "a1_1.h"
int main(){
func(20);
return 0;
}

a1.h:
static int i = 20;

a1_1.h:
#include "a1.h"
int func(val){
extern int i;
i = i + val;
printf("\n i : %d \n",i);
}

这很好用。但这被编译成一个编译单元。因此可以访问静态变量。在整个编译单元中,我们不能通过使用外部变量来使用静态变量。

最佳答案

static 有一个非常简单的逻辑。如果一个变量是static,这意味着它是一个全局变量,但它的范围仅限于它被定义的地方(即只在那里可见)。例如:

  • 在函数外部:全局变量但只在文件(实际上是编译单元)内可见
  • 在函数内部:全局变量但只在函数内部可见
  • (C++) 类内部:全局变量但只对类可见

现在让我们看看 C11 标准对 staticextern 的看法(强调我的):

6.2.2.3

If the declaration of a file scope identifier for an object or a function contains the storage-class specifier static, the identifier has internal linkage.

6.2.2.4

For an identifier declared with the storage-class specifier extern in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage.

6.2.2.7

If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined.

所以标准首先规定,如果您有:

static int m;
extern int m;

那么第二个声明(使用 extern)将考虑第一个声明,最后 m 仍然是 static

但是,在任何其他情况下,如果存在同时具有内部和外部链接的声明,则行为是未定义的。这实际上只留给我们一个选择:

extern int m;
static int m;

extern 声明在 static 声明之前。在这种未定义行为的情况下,gcc 非常好,可以为您提供错误信息。

关于c - m 的静态声明遵循非静态声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com