0

C 编程语言书描述了静态变量的用法,以及主题what-does-static-mean-in-ac-program

  1. 函数内的静态变量在调用之间保持其值。
  2. 静态全局变量或函数仅在其声明的文件中“可见”

解释和书上的一样,但是第1点可以,第2点不行。

我的代码:

头文件.h

static int VAL = 15;
int canShare = 1;

static void hello(char c) {
printf("header file -> VAL: %d\n", VAL);
printf("header file -> canShare: %d\n", canShare);

printf("hello func -> %d\n", c);
}

主程序

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

main() {

printf("main -> VAL: %d\n", VAL+1);
printf("main -> canShare: %d\n", canShare+1);

hello('A');
}

输出

main -> VAL: 16
main -> canShare: 2
header file -> VAL: 15
header file -> canShare: 1
hello func -> 65
4

3 回答 3

3

解释中有一个微妙的不准确之处:

静态全局变量或函数仅在声明它的文件中“可见” 。

它仅在它声明的翻译单元中可用。#include指令从字面上将头文件包含到翻译单元中,因此 TU 包含包含的头文件(如您所料,语法上)。

于 2013-09-21T02:40:58.920 回答
2

当你#include一个头时,头的内容被插入到 .c 文件中。所以在你的例子中,变量VAL和函数hello都在 .c 文件中,它不违反 .c 的规则static

更准确地说,声明为的标识符static具有内部链接,这意味着它们在翻译单元中具有它们的范围。当你#include是一个标题时,那是同一个翻译单元。

于 2013-09-21T02:40:45.980 回答
0

全局级别的静态变量仅在它们自己的源文件中可见,无论它们是通过包含到达那里还是在主文件中。

于 2013-09-21T02:48:46.453 回答