Re[5]: строковый литерал - массив, указатель, шаблон функции
От: rg45 СССР  
Дата: 15.03.06 08:19
Оценка: 3 (1)
"bolshik" <29601@users.rsdn.ru> wrote in message news:1783221@news.rsdn.ru...
> Здравствуйте, rg45, Вы писали:
>
> R>Это означает, что каждый символ этого строкового литерала имеет размер два байта (unicode)
>
> правильно я понимаю, что это относится только к строковым литералам?
> Не поделишься ссылкой, где можно почитать, что еще можно применять к строковым литералам?

Вообще символ L образовался от Long и может применяться не только к строковым литералам.
Например литерал 123123123123123123L задает 64-разрядную целочисленную знаковую константу.
п. 2.13 стандарта дает подробное описание всех возможных в С++ литералов.
В MSDN это тоже есть.
Posted via RSDN NNTP Server 1.9
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: строковый литерал - массив, указатель, шаблон функции
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 08:26
Оценка: +1
Здравствуйте, Demay, Вы писали:

D>Здравствуйте, _Winnie, Вы писали:


D>Можно явно указать шаблонную функцию:

D>
D>WideToUTF8<>(L"hello", s);
D>



В этом-то и фича, что бы явно ничего не указывать. Шаблонная функция здесь выступает в роли хелпера, о которой вообще никто не должен знать по-хорошему. Просто тихо оптимизирует вычисление длины. Ну я так понимаю ситуацию.
Второй момент, что возлагать это на юзера плохо — всё равно ведь не досмотрит — компилятор надёжнее.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: строковый литерал - массив, указатель, шаблон функции
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 15.03.06 08:30
Оценка:
Здравствуйте, rg45, Вы писали:

R>Вообще символ L образовался от Long и может применяться не только к строковым литералам.

R>Например литерал 123123123123123123L задает 64-разрядную целочисленную знаковую константу.
R>п. 2.13 стандарта дает подробное описание всех возможных в С++ литералов.
R>В MSDN это тоже есть.

спасибо
http://denis-zhdanov.blogspot.com
Re: строковый литерал - массив, указатель, шаблон функции
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 08:39
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>...


_W>Когда я вызываю

_W>WideToUTF8(L"hello", s)
_W>то вызывается версия которая принимает указатель, а не ссылку на массив. Почему? Как исправить?


Смотри — с такими вещами надо быть осторожно. Если эта функция используется только как ты привёл: WideToUTF8(L"hello", s); то тогда нормально. А если она используется по-разному и разными людьми, то можно получить нехорошую ситуацию:

wchar_t buf[4096] = {0};
...
someFuncThatFillsBuffer(buf, 1024, ...);

std::string s;
WideToUTF8(buf, s);


В выделенной строчке получишь поведение, которое не совсем ожидалось.


У меня была похожая ситуация и я в целях безопасности для входных буферов оставил только сигнатуру с (const char*), а длина всегда считается автоматически. Т.к. использовались эти функции хаотически и разными людьми.

А вот для выходных буферов это действительно очень полезно:

std::string s = "...";
wchar_t buf[4096] = {0};
WideToUTF8(s, buf);


Размер массива в WideToUTF8 можно сразу на 1 уменьшить, что бы не потереть завершающий ноль.
Тут сразу 3 оптимизации: и память динамически не выделяется под выходной буфер и длина выходного буфера не считается и длина входного буфера не считается, т.к. std::string



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.