c中函数和变量的静态范围用法

时间:2013-09-21 02:36:16

标签: c syntax static

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

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

解释与本书相同,但第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

3 个答案:

答案 0 :(得分:3)

解释中存在微妙的不准确性:

  

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

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

答案 1 :(得分:2)

当您#include标题时,标题的内容将插入到.c文件中。因此,在您的示例中,变量VAL和函数hello位于.c文件中,它不违反static规则。

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

答案 2 :(得分:0)

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