Использование static в структуре typedef

Я использую следующий код в C:

typedef struct
  {
  int member;
  } structname;

Теперь я пытаюсь сохранить это определение структуры локальным в конкретном исходном файле, так что ни один другой исходный файл даже не знает, какая структура существует. Я попробовал следующее:

static typedef struct
  {
  int member;
  } structname;

но GCC скулит из-за нелегального спецификатора доступа. Можно ли вообще сохранить объявление структуры в исходном файле?

Ответ 1

Если вы объявляете структуру typedef в файле .c, она будет закрыта для этого исходного файла.

Если вы объявите этот typedef в файле .h, он будет доступен для всех файлов .c, которые включают этот заголовочный файл.

Ваше выражение:

static typedef struct

Является явно незаконным, поскольку вы не объявляете переменную и не определяете новый тип.

Ответ 2

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

Если структура должна использоваться в другом месте, она должна использоваться только как указатель. Поместите прямое объявление формы struct structname; typedef struct structname structname; в заголовочный файл и используйте structname * всюду в своей кодовой базе. Затем, поскольку элементы структуры отображаются только в одном исходном файле, содержимое структуры эффективно 'private' к этому файлу.

Ответ 3

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

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

Ответ 4

Ответ Hernan Velasquez - правильный ответ: есть несколько проблем с вашим фрагментом кода. Здесь встречный пример:

/* This should go in a .h if you will use this typedef in multiple .c files */
typedef struct {
  int a;
  char b[8];
} mystructdef;

int
main (int argc, char *argv[])
{
  /* "static" is legal when you define the variable ...
    ... but *not* when you declare the typedef */
  static mystructdef ms;