Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание строки, средствами компилятора, создание строковой констаные 
V
    Опции темы
null56
Дата 25.5.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Хотел поинтересноваться следующей темой, существует ли возможность создать строковую константу во время компиляции состоящую из других строковых констант, поясню чего хочу...
У меня есть имя тега, которое я использую в парсере, но так же это имя хочу использовать в создание xml файла, но получается, что я дублирую код и изменяя одно, приходится изменять другое, что мне не совсем по душе... собственно код
Код

const char TagName[] = "my_tag";
const char OpenTagName[] = "<my_tag>";
const char CloseTagName[] = "</my_tag>";

видно из кода, что константы практически одинаковые и изменив переменную TagName, я должен менять переменные OpenTagName и CloseTagName, что не очень хорошо.
Я хочу попросить об этом компилятор, примерно, чего хочу добиться, выглядит в примере ниже, который, ЕСТЕСТВЕННО НЕ СКОМПИЛИТСЯ
Код

const char TagName[] = "my_tag";
char OpenTagName[strlen(TagName+3)] = strcat(strcat(strcat(OpenTagName, "<"), TagName), ">");
char CloseTagName[strlen(TagName+3)] = strcat(strcat(strcat(CloseTagName, "</"), TagName), ">");

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

Заранее благодарен всех откликнувшихся
PM MAIL   Вверх
mes
Дата 25.5.2009, 17:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



не до конца понял требования, но в любом случае, если нужнa манипуляция со строками на этапе компиляции, то надо прибегать к помощи препроцессора.
вот пример , приспосабливайте под свои условия :
Код

#define  DEF_TAGS(tag, value) const char tag ## _Name[]  =      value;         \
                              const char tag ## _Open[]  =  "<" value ">";     \
                              const char tag ## _Close[] = "</" value ">";

    DEF_TAGS(Tag, "test");

#undef DEF_TAGS

int main(){


    std::cout << Tag_Name  << std::endl;
    std::cout << Tag_Open  << std::endl;
    std::cout << Tag_Close << std::endl;

    return 0;

}



Это сообщение отредактировал(а) mes - 25.5.2009, 17:26


--------------------
PM MAIL WWW   Вверх
null56
Дата 25.5.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



mes, то что надо, спасибо.... с макросами мало работал
PM MAIL   Вверх
math64
Дата 26.5.2009, 08:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Без макросов:
Код

class Tag {
char* name;
char* openTag;
char* closeTag;
public:
Tag(const char* name);
~Tag();
const char* Name() { return name; }
const char* OpenTag() { return openTag; }
const char* CloseTag() { return closeTag; }
};

Tag::Tag(const char* p_name) {
int len = strlen(name);
name = new char[len+1];
openTag = new char[len+3];
closeTag = new char[len+4];
strcpy (name, p_name);
sprintf(openTag, "<%s>", p_name);
sprintf(closeTag, "</%s>", p_name);
}

Tag::~Tag() {
delete name;
delete openTag;
delete closeTag;
}

Tag mytag("mytag");

PM   Вверх
null56
Дата 26.5.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



math64, ну это уже исполняемый код, тоже самое, что и со стрингами можно сделать, но без new
PM MAIL   Вверх
math64
Дата 26.5.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Без исполняемого кода - только макросы. Но без new можно обойтись.
Код

char FillTag(const char* TagName, char* OpenTagName, char* CloseTagName);

const char TagName[] = "my_tag";
char OpenTagName[sizeof(TagName)+2];
char CloseTagName[sizeof(TagName)+3];
// Только C++! В С FillTag нужно вызвать из main()
char dummy = FillTag(TagName, OpenTagName, CloseTagName);

char FillTag(const char* TagName, char* OpenTagName, char* CloseTagName) {
sprintf(OpenTagName, "<%s>", TagName);
sprintf(CloseTagName, "</%s>", TagName);
return 0;
}


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.