C编程语言书籍描述了静态变量的用法,以及主题what-does-static-mean-in-a-c-program
- 函数内的静态变量在调用之间保持其值。
- 静态全局变量或函数仅在
中声明的文件中“看到” 醇>
解释与本书相同,但第1点可行,第2点无效。
我的代码:
header.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);
}
main.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
答案 0 :(得分:3)
解释中存在微妙的不准确性:
静态全局变量或函数仅在声明它的文件中“看到”。
它仅在声明的翻译单元中可用。#include
指令字面上将头文件包含在翻译单元中,因此TU包含所包含的标题(如您所料,语法)。
答案 1 :(得分:2)
当您#include
标题时,标题的内容将插入到.c文件中。因此,在您的示例中,变量VAL
和函数hello
位于.c文件中,它不违反static
规则。
更准确地说,声明为static
的标识符具有内部链接,这意味着它们的范围在翻译单元中。当您#include
标题时,这是相同的翻译单元。
答案 2 :(得分:0)
全局级别的静态变量仅在他们自己的源文件中可见,无论他们是通过包含还是在主文件中。