C структура с областью файла - PullRequest
2 голосов
/ 22 октября 2019

Вопрос: Являются ли теги для структур, которые объявлены как статическими в области файла, частной для файла, так же, как будет объявлена ​​действительная переменная структуры? Или теги структуры являются общими для файлов?

Этот вопрос возник из-за проблемы с отладчиком MSVS2019, который показывает неправильные значения и имена членов структуры в некоторых файлах. (Вы можете прочитать об ошибке здесь, если вам интересно: Visual Studio 2019 Debugger Issue ) Все файлы были клонированы из оригинала и имеют что-то вроде этого:

static struct MyPrivateData_s
{
   char *szData[64];
} myData;
static int myCount;

Фактические члены структуры меняются от файла к файлу, и значения для каждого совершенно различны.

Я знаю, что переменные объявлены как статические, но выше любых функций висходный файл имеет "область видимости файла" - глобален для этого файла только . Я почти уверен, что в системе отладки VS есть проблема, но это заставило меня задуматься о том, как (или даже , если ) класс статического хранения влияет на структуру tag .

Если тег обрабатывается как имя структуры и других переменных, он является закрытым для файла. Однако, если тег обрабатывается по-другому, он может вызывать ошибку VS. Помните, я спрашиваю только о теге структуры , а не об имени фактической структурной переменной. Также было бы полезно узнать, как на имена из typedef влияет и «static».

Я пытался найти ответ во всех различных ссылках на C, которыми владеюи могу найти в Интернете, но я (а) не знаю правильный вопрос, чтобы задать и / или (б) не понимаю (или не признаю?) ответ, когда я его нахожу. Надеюсь, гуру Си поможет мне.

FWIW, I думаю, что все, что следует за static в области видимости файла, должно быть ограничено файлом, в котором оно найдено. Фактически, только ниже точки, в которой он находится в файле. Вот как я всегда кодировал, и я никогда не сталкивался с проблемой, прежде чем эта вещь отладчика заставила меня задуматься об этом. Спасибо!

Я думаю, что это может ответить на мой вопрос: Limit Struct Scope , хотя в нем явно не используется термин «тег». Вместо этого он, кажется, называет тег «типом», который становится префиксом «struct». Таким образом, static не имеет никакого эффекта, но тот факт, что тег появляется в файле C, а НЕ в общем заголовке, означает, что тег является частным для файла. Извините, что беспокою.

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

static не влияет на теги структуры или область.

Нет область за пределами область действия файла (C 2018 6.2.1 1). Идентификаторы в разных областях могут ссылаться на один и тот же объект через связь (6.2.2 1). Если разные области видимости находятся в разных единицах перевода, идентификаторы могут ссылаться на один и тот же объект, если они имеют внешнюю связь .

Структурные теги не имеют связи (6.2.2 6: «Следующие идентификаторы не имеют связи: идентификатор, объявленный как что-либо отличное от объекта или функции;… »). Следовательно, теги структуры в разных единицах перевода ссылаются на разные сущности.

Это означает, что типы структуры в разных переводахЕдиницы бывают разных типов. Тогда можно было бы задаться вопросом, как одна и та же структура может использоваться в разных единицах перевода. Согласно 6.2.7 1, типы конструкций в разных единицах перевода могут быть совместимыми . Для структур совместимость в основном требует идентичных определений, с некоторыми допусками, такими как, возможно, пропуск тега.

Наличие static в объявлении (но не внутри [ и ]) влияет на связь (6.2.2 3) и продолжительность хранения (6.2.4 3) для объектов и функций.

Ответы на этот вопрос:

Вопрос: Включены ли теги структуры, которые объявлены как статические в области видимости файла, закрытой для файла так же, как будет объявлена ​​фактическая объявленная переменная структуры? Или теги структуры являются общими для файлов?

static не влияет ни на теги структуры, ни на область видимости. Это влияет на то, могут ли идентификаторы объекта и функции быть связаны между единицами перевода из-за связи, а не области действия.

typedef имена являются псевдонимами.

Было бы также полезно узнать, какимена из typedef также подвержены влиянию «static».

C 2018 6.7.8 3 говорит: «… объявление typedef не вводит новый тип, только синоним для указанного типа…«Как и выше, static влияет только на объекты и функции;не влияет на типы или имена типов.

0 голосов
/ 22 октября 2019

Попробуйте вместо этого:

struct _myprivdata_s_ {
    char *szData[64];
};
typedef struct _myprivdata_s_ MyPrivateData_s;
static MyPrivateData_s myData;
static int myCount;
...