[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: