сравнение с переменной пространства имен - PullRequest
0 голосов
/ 25 мая 2011

Я использую пространство имен в заголовочном файле как в

namespace MyNameSpace
{
    extern string data;
};

А в файле реализации как под.

namespace MyNameSpace
{
        string data = "Data"; 
};

Тогда в какой-то момент моего кода я сравниваю как под.

string mData = "Data";

if(mData == MyNameSpace::data)
{
   //do something
}

Но, когда я сравниваю, это не происходит в сегменте. Что может быть причиной этого.

С уважением, Ленин

Ответы [ 3 ]

0 голосов
/ 25 мая 2011

Не могли бы вы дать нам небольшой, скомпилированный пример проблемы.Код, который вы опубликовали, в порядке;скорее всего, одна из двух переменных не содержит того, что вы думаете.

0 голосов
/ 25 мая 2011

Я не могу определенно быть уверенным, что это вызывает вашу конкретную проблему, потому что я не знаю остальную часть кода.Тем не менее, это должно определенно применяться в любом случае:

Из Руководства по стилю Google C ++ :

Статические или глобальные переменные типа класса запрещены: они вызывают жесткиенаходить ошибки из-за неопределенного порядка строительства и уничтожения.Объекты со статической продолжительностью хранения, включая глобальные переменные, статические переменные, статические переменные-члены класса и статические переменные функции, должны быть Plain Old Data (POD): только целые числа, символы, числа с плавающей запятой или указатели или массивы / структуры POD.

Порядок, в котором вызываются конструкторы классов и инициализаторы для статических переменных, только частично указан в C ++ и может даже меняться от сборки к сборке, что может вызвать ошибки, которые трудно найти.Поэтому, в дополнение к запрету глобальных типов класса, мы не разрешаем инициализировать статические переменные POD с результатом функции, если только эта функция (такая как getenv () или getpid ()) сама по себе не зависит от каких-либо других глобальных переменных..

Аналогично, порядок, в котором вызываются деструкторы, определяется как обратный порядку, в котором вызываются конструкторы.Так как порядок конструктора не определен, то и порядок деструктора.Например, во время завершения программы статическая переменная могла быть уничтожена, но все еще работающий код - возможно, в другом потоке - пытается получить к ней доступ и завершается неудачно.Или деструктор для статической переменной 'string' может быть запущен перед деструктором для другой переменной, которая содержит ссылку на эту строку.

В результате мы разрешаем только статическим переменным содержать данные POD.Это правило полностью запрещает vector (используйте вместо этого массивы C) или строку (используйте const char []).

Если вам нужна статическая или глобальная переменная типа класса, рассмотрите возможность инициализации указателя (который никогда не будетосвобожден), либо из вашей функции main (), либо из pthread_once ().Обратите внимание, что это должен быть необработанный указатель, а не «умный» указатель, поскольку деструктор умного указателя будет иметь проблему с порядком деструкторов, которую мы пытаемся избежать.

Короче говоря:Константы типа "строка" никогда не должны использоваться.Вы можете использовать что-то вроде

const char data[] = "Data";
0 голосов
/ 25 мая 2011

У вас есть один = Это оператор присваивания.

Вам нужна mData == MyNameSpace :: data

С mData = MyNameSpace :: data значение выражения, отличное от нуля (это адрес, где хранятся «данные») так что это правда (все, кроме нуля, считается истиной).

Edit: Если вы компилируете с помощью gcc, некоторые флаги, такие как -Wall, могут помочь вам найти такие ошибки / ошибки.

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