передать статическую переменную между двумя файлами в C / C ++ - PullRequest
4 голосов
/ 03 октября 2010

У меня вопрос к передаче статических переменных между двумя файлами.

Теперь у меня есть один файл Ac и второй файл B.cpp

В Ac

static struct {
   int 
   int 
} static_variable

Теперь Ac должен вызвать функцию func() в B.cppи эта функция должна изменить static_variable в Ac

в B.cpp

func() {

  static_variable = ***;

}

Я понимаю, что B.cpp не может получить доступ к статической переменной в Ac, поэтому если я действительночто нужно сделать, что мне делать?

Ответы [ 5 ]

11 голосов
/ 03 октября 2010

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

Даже если переменная равна static, вы можете передать указатель на переменную static функции в другом переводе.Блок.Внутренняя связь применяется только к имени переменной, доступ к ней по-прежнему возможен с помощью средств, не требующих присвоения имени переменной.

1 голос
/ 03 октября 2010

Я бы определил функцию получения и установки в A.c. Опытные образцы могут быть помещены в A.h.

Тогда B.c включит A.h и вызовет установщик вместо прямой установки переменной.

Использование метода установки / получения имеет ряд преимуществ:

  • Возможна обработка одновременного доступа
  • Центральная точка для регистрации изменений в переменной
0 голосов
/ 03 октября 2010

Решение 1: Поместите func() в Ac.(РЕДАКТИРОВАТЬ [ благодаря Бену Фойгту ]: но вы не можете сделать это, если func() использует функции C ++).

Решение 2: Запись get_static_variable() иset_static_variable() функционирует в Ac и вызывает их из Bc

Примечание: Я предположил, что предоставленный вами код содержит опечатку, и я следовал вашему описанию.

0 голосов
/ 03 октября 2010

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

Вам нужно сделать две вещи:

  1. обеспечить, чтобы объявление рассматриваемой структуры было доступно B.cpp (т.е. поместить объявление в заголовочный файл, включенный в оба)
  2. Передайте указатель (или в c ++, ссылку) на переменную в func. Это может быть либо непосредственно в качестве аргумента, либо (уродливее!) Через нестатическую переменную.
0 голосов
/ 03 октября 2010

Во-первых, ваша структура недействительна, потому что вы не указываете имена для типов.

Во-вторых, вы не объявили ничего статичного ...

Наконец, я не совсем уверен, что вы пытаетесь сделать ... Вы, конечно, можете передавать структуры в функции разными способами ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...