объявление статических переменных в функции - PullRequest
1 голос
/ 16 февраля 2010

gcc 4.4.2 c89

Я переработал чужой исходный код.

В функции кто-то объявил некоторые статические переменные, но, кажется, не служит какой-либо цели их статичности. Мне просто интересно, будет ли мой комментарий ниже точным?

static char tempstr[64]; 

Насколько я понимаю, при объявлении статических переменных внутри функции, которую она сохранит, будет видимость, поэтому она действует как глобальная переменная.

Кроме того, если статическая переменная объявлена ​​в глобальной области видимости, то ее область действия ограничена только файлом.

Большое спасибо за любые предложения,

Ответы [ 4 ]

4 голосов
/ 16 февраля 2010

Если я понимаю вашу интерпретацию, это точно.

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

Это имеет большое значение, если предыдущее значение используется в последующем вызове функции или если ссылка вытекла из функции посредством внешнего вызова или путем возврата указателя.

2 голосов
/ 16 февраля 2010

Это не делает его глобальным.Это все еще локальная переменная, которая просто сохраняет свое значение во время последовательных вызовов.

2 голосов
/ 16 февраля 2010

Да, ваша интерпретация верна. За исключением того, что будьте осторожны с тем, что вы называете «действует как глобальный». Он действует как глобальный только в том смысле, что он сохраняет значения между вызовами, но он не виден глобально, а только в той функции, которая его объявила.

Также см. этот вопрос .

1 голос
/ 16 февраля 2010

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

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