пятница, 6 июня 2008 г.

Слияние строк.

В продолжение предыдущей темы немного углублюсь в подробности...

Испокон веков в си, а следовательно и в c++ два рядом расположенных строковых литерала без разделителей конкатенировались, или как это по русски то? :) сливаются.
printf ("Hello " "world!\n");

Выдает на экране естественно 'Hello world!'. Но это еще не все...

Это так же работает с использованием макросов препроцессора, или правильнее сказать определений, ведь это просто строковая константа.
printf ("Hello " __FILE__ "!\n");

Выдает на экран 'Hello test.c!', чего собственно и добивались.

До некоторых пор аналогично работали и определения __FUNCTION__ и __PRETTY_FUNCTION__, но все меняется когда приходят они - новые стандарты. :) Всвязи с приходом стандарта c99 введена новая константа, содержащая имя функции - __func__. Причем, стоит отметить, что это именно строковая константа, а не определение препроцессора, то есть фокусы со слиянием строк уже не пройдут. А вышеуказанные __FUNCTION__ и __PRETTY_FUNCTION__ отныне просто синонимы __func__. За исключением C++, в котором __PRETTY_FUNCTION__ содержит полное имя функции с типом и аргументами.

В info gcc отмечено, что начиная с gcc-3.4 эти имена не конкатенируются с другими строками, и вообще не стандартны в отличии от __func__. А еще отмечено что __FUNCTION__ и __PRETTY_FUNCTION__ в C++ всегда были переменными. Я этого не знал, как всетаки иногда полезно почитать маны...

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