2010-10-02 2 views
4

У меня есть вопрос, чтобы задать вопрос о передаче статических переменных между двумя файлами.передать статическую переменную между двумя файлами в C/C++

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

В Ac

static struct { 
    int 
    int 
} static_variable 

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

в B.cpp

func() { 

    static_variable = ***; 

} 

I унд что B.cpp не может получить доступ к статической переменной в A.c, поэтому, если мне действительно нужно это сделать, что мне делать?

ответ

0

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

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

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

11

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

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

0

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

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

  1. убедитесь, что декларация структуры в вопросе доступна B.cpp (т.е. поместить объявление в файле заголовка, включенной обоими)
  2. пропускам указатель (или в C++, ссылка) на переменную func. Это может быть либо как аргумент, либо (уродливый!) С помощью нестатической переменной.
1

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

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

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

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

Решение 1: Put func() в Ac Здесь и должно быть. (EDIT [спасибо Ben Voigt]: Но вы не можете этого сделать, если func() использует функции C++).

Решение 2: Написать get_static_variable() и set_static_variable() функции A.c и вызывать их из B.C.

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

+0

Решение 1 может быть невозможно, если 'func()' использует функции C++ (в конце концов, он находится в файле .cpp). –

+0

Хм, ты прав. не заметил, что он находится в файле cpp. – Donotalo

Смежные вопросы