Переменные автоматически инициализируются в 0 в безымянном пространстве имен? - PullRequest
1 голос
/ 29 июня 2011

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

Но у меня есть функция, определенная в безымянном пространстве имен. Внутри функции есть массив char, объявленный без явной инициализации в 0. Будет ли он автоматически инициализироваться в 0? Как насчет переменных, которые не объявлены как статические, но определены в безымянном пространстве имен? А как насчет локальных переменных статических функций?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2012

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

int foo; // static storage duration (because it's global) automatically zero-initialized

static int foo2; // static storage duration (because it's global) automatically zero-initialized. The static keyword just gives the name 'foo2' internal linkage and has nothing to do with static storage duration.

namespace {

    int foo; // static storage duration, automatically zero-initialized

    void bar() {
        int f; // local variable, not automatically zero-initialized

        static int g; // static storage duration (because of the keyword static), automatically zero-initialized
    }
}
1 голос
/ 11 июля 2011

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

1 голос
/ 11 июля 2011

Никогда не полагайтесь на то, что что-то инициализируется / делается для вас.Просто выполняйте инициализацию всегда, поскольку все может измениться, и вы будете застигнуты врасплох.

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