Re: NULL и g++
On Wed, 27 Sep 2000, Eugene Osintsev wrote:
> On Wed, 27 Sep 2000, Vlad Harchev wrote:
>
> > Если программа состоит из более чем из одного исходного файла, то все файлы
> > должны узнавать о существовании константы через хидер, типа
> >
> > extern const int NULL;
> > И только в одно cpp файле должно стоять
> > const int NULL=0;
> > Так как остальные файлы сырца видят только "extern const int NULL"
> > они _вообще_ не знают о значении этой константы, и им придется загружать
> > каждый раз из памяти ее значение при сравнении! Это неоптимально.
> >
> > Более оптимальный вариант
> > enum { NULL = 0 };
>
> Ничего подобного. Ваш enum полностью эквивалентен тому, если вы в хедере
> напишете
>
> const int NULL = 0;
>
> Не надо никаких extern'ов городить. extern'ы подразумевают external
> linkage в C++, что, разумеется, приводит к выделению памяти. ;-)
const int NULL = 0;
_приводит_ к выделению памяти, по крайне мере у gcc. Только что проверял с
помощью nm (написал программу из двух модулей, в каждом из которых было
const int _NULL = 0;
, собрал ее; nm сказал что есть две переменных с именем _NULL с различными
адресами памяти. А насчет extern'ов - вы правы - их не надо упортреблять -
тогда компилятор будет знать значение константы и будет подставлять ее
значение напрямую.
> Я, кстати, не защищаю данный метод работы с константами. И, видимо,
> из-за всех этих различий с internal и external linkage в C и C++ так
> живучи #define'ы. Хотя может быть я и не прав.
Я тоже, но если надо определять константы - enum намного круче. Он еще дает
typesafety если оно надо. Например, gtk (написанный на C) вовсю использует
enum, и анонимные в том числе. Да и отладчиком можно потом глянуть, какое
значение у данной константы enum, что нельзя сказать о макросах.
> И, вообще, не стоит переопределять NULL. Больше проблем нагребёшь.
Согласен.
Best regards,
-Vlad
Reply to: