2013-09-21 2 views
0

Язык программирования C книге описывается использование статической переменной, и тему what-does-static-mean-in-a-c-programстатическое использование возможности для функций и переменных в C

  1. Статическая переменная внутри функции сохраняет свое значение между вызовами.
  2. Статическая глобальная переменная или функция «видеть» только в файле он объявлен в

объясняет так же, как в книге, но пункт 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

Вы действительно не должны обычно ставить определение статической функции в заголовок (хотя исключение может быть сделано для встроенной статической функции). Каждый исходный файл, который использует заголовок, получает свою собственную копию функции. Обычно вы не должны указывать определение статической переменной в заголовке. Каждый исходный файл, который использует заголовок, получает свою собственную копию переменной. Вы используете заголовок для информации, которая должна быть разделена между файлами. И программа, состоящая из одного исходного файла и заголовка, не делится ничем с другими файлами - как заметил кто-то другой, это единственная единица перевода (TU). –

+0

Вы также должны избегать определения переменных (путем их инициализации) в заголовках. Все в порядке писать 'extern int canShare;' в заголовке, но записывая 'int canShare = 1;' в заголовок, проталкивается в реализацию, не строгое стандартное поведение. Для получения дополнительной информации см. [Что такое 'extern' переменные в C?] (Http://stackoverflow.com/questions/1433204/) –

+0

' #include "header.h" директивы будут содержать содержимое 'header.h' во время компиляции, поэтому они фактически являются частью содержимого 'main.c'? – zxkletters

ответ

2

Когда вы #include заголовок, содержимое заголовка я s вставлен в .c файл. Итак, в вашем примере переменная VAL и функция hello находятся в .c файле, это не нарушает правило static.

Чтобы быть более точным, идентификаторы, объявленные как static, имеют внутреннюю связь, что означает, что они имеют свою область действия в блоке перевода. Когда вы заголовок #include, это та же единица перевода.

3

Существует тонкая неточность в интерпретации:

Статическая глобальная переменная или функция «видеть» только в файле он объявлен в

Он доступен только в. блок перевода , он объявлен в. Директивы #include буквально включают файл заголовка в блок перевода, поэтому TU включает включенный заголовок (как и следовало ожидать, грамматически).

0

Статические переменные на глобальном уровне видны только в их собственном исходном файле, независимо от того, были ли они получены через include или были в основном файле.

Смежные вопросы