Russian Qt Forum

Программирование => С/C++ => Тема начата: cya-st от Сентябрь 17, 2009, 11:49



Название: Подстановка строк.
Отправлено: cya-st от Сентябрь 17, 2009, 11:49
Всем привет! Подскажите пожалуйста как или где в програме можно хранить и использовать строку большого размера. Например: #define MY_STR "kjsfdk...", но проблема в том что в дефайне я немогу переносить строку. Надеюсь я правильно выразился.


Название: Re: Подстановка строк.
Отправлено: Barmaglodd от Сентябрь 17, 2009, 11:57
Зачем define?

1. const char* (глобальная переменная)
2. сохранить в ресурс
3. сохранить в файл и читать из него


Название: Re: Подстановка строк.
Отправлено: BRE от Сентябрь 17, 2009, 12:08
Всем привет! Подскажите пожалуйста как или где в програме можно хранить и использовать строку большого размера. Например: #define MY_STR "kjsfdk...", но проблема в том что в дефайне я немогу переносить строку. Надеюсь я правильно выразился.

Так делать конечно не стоит.

На счет переноса строк в дефайнах:
Код
C++ (Qt)
#define DEF ...... \
                ...... \
                ......


Название: Re: Подстановка строк.
Отправлено: cya-st от Сентябрь 17, 2009, 12:13
Мне больше define нравится, почему его нежелательно использовать?
Цитировать
Так делать конечно не стоит.


Название: Re: Подстановка строк.
Отправлено: spectre71 от Сентябрь 17, 2009, 12:37
Всем привет! Подскажите пожалуйста как или где в програме можно хранить и использовать строку большого размера. Например: #define MY_STR "kjsfdk...", но проблема в том что в дефайне я немогу переносить строку. Надеюсь я правильно выразился.
1) Насколько большого размера?
2) в дефайне можно переносить строку

Код:
#define MY_STR "1234567890" \
  "abcde" \
  "ABCDE"

3) Можно еще так

Код:
const char* MY_STR = "1234567890" 
  "abcde"     
  "ABCDE";


Название: Re: Подстановка строк.
Отправлено: cya-st от Сентябрь 17, 2009, 12:52
Цитировать
1) Насколько большого размера?
Размер гдето до 30кБ.


Название: Re: Подстановка строк.
Отправлено: BRE от Сентябрь 17, 2009, 13:04
Мне больше define нравится, почему его нежелательно использовать?
define исторически остался от C. Сейчас рекомендуется вместо него использовать enum и const.

#define это макрос, т.е. все что идет за ним просто подставляется в текст программы место его имени.
С этим могут быть проблемы:
Код
C++ (Qt)
#defien NUM 10 + 10
int val = NUM * 2;
 
эта конструкция развернеться в:
Код
C++ (Qt)
int val = 10 + 10 * 2;
 
Соответственно результат будет не 40, как хотелось бы, а 30.
С константой такое произойти не может.

#define A 10.123

Константа расположена в одном месте, макрос же будет подставлять это число там где будет прописано имя макроса. Для чисел с плавающей точкой это меннее эффективно.
Также для строк. Если макрос будет использован в нескольких файлах, копия этой строки будет в каждой объектной единице (хотя компилятор сможет это оптимизировать, но это будет заслуга компилятора).

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

Макрос не принадлежит пространствам имен.

Сейчас не вспомню все проблемы, но они есть.


Название: Re: Подстановка строк.
Отправлено: spectre71 от Сентябрь 17, 2009, 13:09
Цитировать
1) Насколько большого размера?
Размер гдето до 30кБ.
Ничего страшного.
Если подстановка в одном файле(в одном obj), можешь использовать define, если в несколько, то лучше const char*


Название: Re: Подстановка строк.
Отправлено: Igors от Сентябрь 17, 2009, 13:25
Цитировать
1) Насколько большого размера?
Размер гдето до 30кБ.
Однозначно, ресурсы - лучший вариант. Можно также использовать их как утилиту:

- добавляем файл 30Kb в qrc и обновляем проект - создан qrc_MyPrj.cpp файл

- из созданного файла забираем уже оформленные данные, нет никаких проблем с переводами строк и т.п.

Хотя и просто загрузить из ресурса - одно удовольствие


Название: Re: Подстановка строк.
Отправлено: cya-st от Сентябрь 17, 2009, 13:25
Всем спасибо за помощь. Буду использовать const char*.