Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

38K
17 июля 2008 года
sneg
13 / / 16.07.2008
Есть набор глобальных строковых констант в виде:
 
Код:
const char *str1 = "... <COMMON> ...";
const char *str2 = "... <COMMON> ...";
const char *str3 = "... <COMMON> ...";
const char *str4 = "... <COMMON> ...";
...

где вместо "..." присутствует какой-то текст, а под <COMMON> подразумевается текст, одинаковый для всех строк. Можно ли средствами препроцессора сделать, чтобы в одном месте определялась эта общая часть (#define COMMON substitution) и затем подставлялась во все константы?
Пробовал играться с операторами # и ## - не получилось.
9.4K
17 июля 2008 года
AIGrifon
165 / / 13.11.2007
Если пытаться проверныть такую постановку прямо в строковую константу, то ничего не получиться и не должно получаться в принципе. Достаточно вспомнить как работает препроцессор и все сразу становится ясно.
38K
17 июля 2008 года
sneg
13 / / 16.07.2008
предполагалось что это будет выглядеть примерно так
 
Код:
#define AAA real_text
#define TO_STR(arg) #arg
#define JOIN(arg1,arg2) arg1##arg2

const char *str = TO_STR(AAA);


но препроцессор сначала встречает TO_STR, поэтому в str идет "ААА". Может можно это как-то обойти? ;)
5
17 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: sneg
Может можно это как-то обойти? ;)

Константы поменять на DEFINE-ы.

12K
17 июля 2008 года
lifs
163 / / 06.09.2007
 
Код:
#define COMMON "HELLO"

const char *str1 = "..." COMMON "...";
const char *str2 = "..." COMMON "...";
const char *str3 = "..." COMMON "...";
const char *str4 = "..." COMMON "...";
38K
18 июля 2008 года
sneg
13 / / 16.07.2008
to lifs

Пашет, спасибо =)
38K
08 августа 2008 года
sneg
13 / / 16.07.2008
Усложняем =).

Теперь нужно инициализировать WCHAR* константы. Т.е. нужно перед инициализирующей константой приписать L или заключить её в макрос TEXT().

 
Код:
#ifdef CASE1
   #define COMMON common1
#else
   #define COMMON common2
#endif

const WCHAR *str1 = L"... COMMON ...";
const WCHAR *str2 = L"... COMMON ...";
const WCHAR *str3 = L"... COMMON ...";


Подскажите девелоперы добрые, реально ли такую штуку изобразить?
38K
08 августа 2008 года
sneg
13 / / 16.07.2008
Спасибо, добрые девелоперы! =)

Ответ выглядит примерно так:

 
Код:
#define COMMON 'c','o','m','m','o','n'

const WCHAR str1[] = {'a','_',COMMON,'_','b','\0'};
const WCHAR str2[] = {'d','_',COMMON,'_','e','\0'};


Если найдутся другие варианты - интересно буит глянуть.
87
08 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: sneg
Если найдутся другие варианты - интересно буит глянуть.


Чисто теоретически (не проверял)

 
Код:
#define COMMON "COMMON"
#define SET_STR(STRBEGIN,STREND) TEXT(STRBEGIN COMMON STREND)

const wchar *str[3] =
{
    SET_STR("0. ","; END OF 0"),
    SET_STR("1. ","; END OF 1"),
    SET_STR("2. ","; END OF 2")
};
12K
08 августа 2008 года
lifs
163 / / 06.09.2007
 
Код:
#ifdef CASE1
    #define COMMON1 TEXT("HELLO")
#else
    #define COMMON1 TEXT("BYE")
#endif

const WCHAR *str1 = TEXT("1...") COMMON1 TEXT("...");
const WCHAR *str2 = TEXT("2...") COMMON1 TEXT("...");
const WCHAR *str3 = TEXT("3...") COMMON1 TEXT("...");
const WCHAR *str4 = TEXT("4...") COMMON1 TEXT("...");
38K
08 августа 2008 года
sneg
13 / / 16.07.2008
Kogrom
Проверил.
 
Код:
#define COMMON "COMMON"
#define SET_STR(STRBEGIN,STREND) TEXT(STRBEGIN COMMON STREND)

const WCHAR *wstr = SET_STR("a","b\0");


выдало:
Цитата:

error: concatenating mismatched strings. Сoncatenating wide "a" with narrow "COMMON"
error: concatenating mismatched strings. Concatenating wide "a" with narrow "b"



Т.е. TEXT() поставил L только перед STRBEGIN, а перед "COMMON" и "b\0" надо самому ставить. Тогда станет как у lifs.

lifs
Работает, маленькое замечание - нолик в конец константы ;)

Всем спасибо!

12K
08 августа 2008 года
lifs
163 / / 06.09.2007
Цитата: sneg

Работает, маленькое замечание - нолик в конец константы ;)



Зачем нолик? Строка и так завершится нулем.

87
09 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: sneg
Т.е. TEXT() поставил L только перед STRBEGIN, а перед "COMMON" и "b\0" надо самому ставить.



Ну да, действительно, надо везде TEXT ставить. Хотя, может только COMMON надо в TEXT поместить... не совсем понятно, почему препроцессор придрался к последней части строки...

Но у меня там еще был намек, что в вашей программе неплохо бы использовать массивы. Может хоть этим помог :)

38K
12 августа 2008 года
sneg
13 / / 16.07.2008
Цитата:
Зачем нолик? Строка и так завершится нулем.


нуда, еще раз проверил, я ошипся.

Цитата:
в вашей программе неплохо бы использовать массивы


Спасибо за участие, но в моей программе вместо str1, str2... более осмысленные имена и с массивом будет не так удобно.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог