Использование 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;