Есть ли случай, когда ключевое слово static C должно или могло бы использоваться в заголовочных файлах для переменных? - PullRequest
3 голосов
/ 21 июня 2019

Мы можем предположить , что ключевое слово static не должно использоваться в заголовочном файле - для переменных .

Заголовочный файл содержит толькоextern объявления переменных - никогда static или определения переменных без оговорок.

Существует ли исключение, когда ключевое слово C static должно или могло бы использоваться в заголовочных файлах для переменных?Почему?

Ответы [ 2 ]

4 голосов
/ 21 июня 2019

Я использую static в заголовочных файлах только для определения констант. Пример:

MyProject.h

 static const int DebugLevel = 3;

Module.c

int foo(int x)
{
   if (DebugLevel>2) 
      printf("foo(int x) called with x=%d\n", x);
   ...
}

Преимущества этого подхода:

  • Изменение одного оператора в одном месте автоматически распространяется во всех модулях.
  • Использование const позволяет компилятору оптимизировать оператор if. Вызов printf также может быть удален.
  • Использование static позволяет компилятору полностью оптимизировать переменную, не тратя память.
3 голосов
/ 21 июня 2019

Информация, относящаяся к единице перевода ( т.е. , исходный файл C), которая должна быть частью каждого скомпилированного объектного файла, но по какой-то причине должна быть разной для каждого входного исходного файла.

Например, информация об отладке или сборке, используемая для отслеживания происхождения определенного объектного файла.Или, может быть, организация хочет внедрить информацию об авторских правах непосредственно в каждый объектный файл.

Например, файл "buildinfo.h":

#ifndef BUILDINFO_H_INCLUDED
#define BUILDINFO_H_INCLUDED

static char my_org_copyright[] = "Copyright ...";
static char my_org_build_info[] = "Compiled on " __DATE__ "@" __TIME__;

#endif

Полезность изтакие данные спорны, но я видел такие конструкции, используемые в коде, созданном очень крупной корпорацией ...

...