Прямой доступ к статической переменной одного модуля компиляции из других, в C - PullRequest
3 голосов
/ 13 января 2011

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

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

Можно ли получить доступ к статическим переменным модуля компиляции напрямую?

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

Надеюсь, это имеет смысл! Спасибо!

РЕДАКТИРОВАТЬ: Хорошо, так что, кажется, то, что я спрашиваю, невозможно - кто-нибудь из вас видит альтернативы, которые, по сути, позволяют мне напрямую получать доступ к данным другого модуля компиляции?

РЕДАКТИРОВАТЬ 2: Спасибо за ответы Пабло и Джонатан. В итоге я принял Пабло, потому что у меня не было четкого места, чтобы получить указатель на статические данные (согласно Джонатану) в моей ситуации . Еще раз спасибо!

Ответы [ 2 ]

8 голосов
/ 13 января 2011

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

Если вам нужен доступ к глобальным переменным одного модуля компиляции из другого, вы можете сделать:

file1.c:

int var_from_file1 = 10;

file2.c:

extern int var_from_file1;
// you can access var_from_file1 here

Если вы можете удалить ключевое слово static из ваших объявлений, все будет в порядке. Я понимаю, что изменение существующего исходного кода не всегда является вариантом (т. Е. Работа с существующим устаревшим скомпилированным кодом).

3 голосов
/ 13 января 2011

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

Итак, вы можете упаковать «статические переменные» в одну структуру, а затем написать функцию, которая возвращает указатель на эту структуру;Вы можете вызвать эту функцию, чтобы получить доступ к статическим переменным.

Аналогичные правила применяются к статическим функциям;если какая-либо функция (или нестатическая переменная) в файле делает указатели на функции доступными, тогда статические функции можно вызывать косвенно из-за пределов файла.

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

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