Язык программирования C книге описывается использование статической переменной, и тему what-does-static-mean-in-a-c-programстатическое использование возможности для функций и переменных в C
- Статическая переменная внутри функции сохраняет свое значение между вызовами.
- Статическая глобальная переменная или функция «видеть» только в файле он объявлен в
объясняет так же, как в книге, но пункт 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
Вы действительно не должны обычно ставить определение статической функции в заголовок (хотя исключение может быть сделано для встроенной статической функции). Каждый исходный файл, который использует заголовок, получает свою собственную копию функции. Обычно вы не должны указывать определение статической переменной в заголовке. Каждый исходный файл, который использует заголовок, получает свою собственную копию переменной. Вы используете заголовок для информации, которая должна быть разделена между файлами. И программа, состоящая из одного исходного файла и заголовка, не делится ничем с другими файлами - как заметил кто-то другой, это единственная единица перевода (TU). –
Вы также должны избегать определения переменных (путем их инициализации) в заголовках. Все в порядке писать 'extern int canShare;' в заголовке, но записывая 'int canShare = 1;' в заголовок, проталкивается в реализацию, не строгое стандартное поведение. Для получения дополнительной информации см. [Что такое 'extern' переменные в C?] (Http://stackoverflow.com/questions/1433204/) –
' #include "header.h" директивы будут содержать содержимое 'header.h' во время компиляции, поэтому они фактически являются частью содержимого 'main.c'? – zxkletters