Как объявлять строковые константы
От: 3m-soft  
Дата: 31.07.13 04:02
Оценка:
Разумеется, речь идет не о чистых C-style строковых константах.
Хочу объявлять строковые константы с дополнительными служебными данными. Например, в минус первой позиции автоматически компилятором размещается длина строки, в минус второй и так далее могу я сам что-то размещать. И всё это непрерывным блоком, без буста (если он это позволяет), на компиляторе MSVC2012.
У меня есть свой способ, но он с недостатками. Надеюсь, есть способ получше.
Re: Как объявлять строковые константы
От: 3m-soft  
Дата: 31.07.13 04:17
Оценка:
Уточнение: без указания имени переменной. Просто указываем в качестве параметра для функции.
Re: Как объявлять строковые константы
От: Zhendos  
Дата: 31.07.13 04:42
Оценка: 6 (2)
Здравствуйте, 3m-soft, Вы писали:

3S>Разумеется, речь идет не о чистых C-style строковых константах.

3S>Хочу объявлять строковые константы с дополнительными служебными данными. Например, в минус первой позиции автоматически компилятором размещается длина строки, в минус второй и так далее могу я сам что-то размещать. И всё это непрерывным блоком, без буста (если он это позволяет), на компиляторе MSVC2012.
3S>У меня есть свой способ, но он с недостатками. Надеюсь, есть способ получше.

Можно посмотреть как это сделали в qt5:
http://woboq.com/blog/qstringliteral.html

если кратко то там для этого заюзали лямбда функции
Re[2]: Как объявлять строковые константы
От: 3m-soft  
Дата: 31.07.13 05:01
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Можно посмотреть как это сделали в qt5:

Z>http://woboq.com/blog/qstringliteral.html

Z>если кратко то там для этого заюзали лямбда функции


Спасибо за наводку. Мой метод такой же, но, как я уже сказал, он имеет недостатки:
1) Такая лямбда-функция хорошо инлайнится в релизной версии, а в отладочной версии получаем вызов функции. Хочу без вызова функции везде.
2) Этот метод нельзя использовать в списке инициализации структуры или массива. Лично у меня MSVC2012 крашится на этом.
Re: Как объявлять строковые константы
От: enji  
Дата: 31.07.13 06:23
Оценка:
Здравствуйте, 3m-soft, Вы писали:

3S>Разумеется, речь идет не о чистых C-style строковых константах.

3S>Хочу объявлять строковые константы с дополнительными служебными данными. Например, в минус первой позиции автоматически компилятором размещается длина строки, в минус второй и так далее могу я сам что-то размещать. И всё это непрерывным блоком, без буста (если он это позволяет), на компиляторе MSVC2012.
3S>У меня есть свой способ, но он с недостатками. Надеюсь, есть способ получше.

Строковые литералы (не уверен что они есть в мсвц) или свой препроцессор
Re: Как объявлять строковые константы
От: nen777w  
Дата: 31.07.13 09:07
Оценка:
3S>Разумеется, речь идет не о чистых C-style строковых константах.
3S>Хочу объявлять строковые константы с дополнительными служебными данными. Например, в минус первой позиции автоматически компилятором размещается длина строки, в минус второй и так далее могу я сам что-то размещать. И всё это непрерывным блоком, без буста (если он это позволяет), на компиляторе MSVC2012.
3S>У меня есть свой способ, но он с недостатками. Надеюсь, есть способ получше.

Можно так:

#define DECLARE_STRING_CONSTANT( name, str ) \
    const char name[] = { 2, (char)sizeof(str), str }; 

#define DECLARE_STRING_CONSTANT_ARG( name, str, arg ) \
    const char name[] = { 3, (char)sizeof(str), arg, str }; 

#define GET_STR(name) \
    name+name[0]

void foo()
{
    DECLARE_STRING_CONSTANT( name, "test" );
    DECLARE_STRING_CONSTANT_ARG(name2, "test2", 5);

    printf(GET_STR(name));
    printf(GET_STR(name2));
}


вместо arg можно заюзать BOOST_PP и задавать его например так (4)((3)(2) и немного переписать макрос что бы тот раскрывал этот сиквенс в декларации, по сути BOOST_PP_SEQ_ENUM()
Re[2]: Как объявлять строковые константы
От: 3m-soft  
Дата: 31.07.13 09:54
Оценка:
Спасибо за предложения. Но вариант с лямбдой, по-моему, получше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.