const char *str1 = "... <COMMON> ...";
const char *str2 = "... <COMMON> ...";
const char *str3 = "... <COMMON> ...";
const char *str4 = "... <COMMON> ...";
...
Можно ли сделать директивами препроцессора ?
Код:
где вместо "..." присутствует какой-то текст, а под <COMMON> подразумевается текст, одинаковый для всех строк. Можно ли средствами препроцессора сделать, чтобы в одном месте определялась эта общая часть (#define COMMON substitution) и затем подставлялась во все константы?
Пробовал играться с операторами # и ## - не получилось.
Если пытаться проверныть такую постановку прямо в строковую константу, то ничего не получиться и не должно получаться в принципе. Достаточно вспомнить как работает препроцессор и все сразу становится ясно.
Код:
#define AAA real_text
#define TO_STR(arg) #arg
#define JOIN(arg1,arg2) arg1##arg2
const char *str = TO_STR(AAA);
#define TO_STR(arg) #arg
#define JOIN(arg1,arg2) arg1##arg2
const char *str = TO_STR(AAA);
но препроцессор сначала встречает TO_STR, поэтому в str идет "ААА". Может можно это как-то обойти? ;)
Цитата: sneg
Может можно это как-то обойти? ;)
Константы поменять на DEFINE-ы.
Код:
#define COMMON "HELLO"
const char *str1 = "..." COMMON "...";
const char *str2 = "..." COMMON "...";
const char *str3 = "..." COMMON "...";
const char *str4 = "..." COMMON "...";
const char *str1 = "..." COMMON "...";
const char *str2 = "..." COMMON "...";
const char *str3 = "..." COMMON "...";
const char *str4 = "..." COMMON "...";
Пашет, спасибо =)
Теперь нужно инициализировать 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 ...";
#define COMMON common1
#else
#define COMMON common2
#endif
const WCHAR *str1 = L"... COMMON ...";
const WCHAR *str2 = L"... COMMON ...";
const WCHAR *str3 = L"... COMMON ...";
Подскажите девелоперы добрые, реально ли такую штуку изобразить?
Ответ выглядит примерно так:
Код:
#define COMMON 'c','o','m','m','o','n'
const WCHAR str1[] = {'a','_',COMMON,'_','b','\0'};
const WCHAR str2[] = {'d','_',COMMON,'_','e','\0'};
const WCHAR str1[] = {'a','_',COMMON,'_','b','\0'};
const WCHAR str2[] = {'d','_',COMMON,'_','e','\0'};
Если найдутся другие варианты - интересно буит глянуть.
Цитата: 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")
};
#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")
};
Код:
#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("...");
#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("...");
Проверил.
Код:
#define COMMON "COMMON"
#define SET_STR(STRBEGIN,STREND) TEXT(STRBEGIN COMMON STREND)
const WCHAR *wstr = SET_STR("a","b\0");
#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
Работает, маленькое замечание - нолик в конец константы ;)
Всем спасибо!
Цитата: sneg
Работает, маленькое замечание - нолик в конец константы ;)
Зачем нолик? Строка и так завершится нулем.
Цитата: sneg
Т.е. TEXT() поставил L только перед STRBEGIN, а перед "COMMON" и "b\0" надо самому ставить.
Ну да, действительно, надо везде TEXT ставить. Хотя, может только COMMON надо в TEXT поместить... не совсем понятно, почему препроцессор придрался к последней части строки...
Но у меня там еще был намек, что в вашей программе неплохо бы использовать массивы. Может хоть этим помог :)
Цитата:
Зачем нолик? Строка и так завершится нулем.
нуда, еще раз проверил, я ошипся.
Цитата:
в вашей программе неплохо бы использовать массивы
Спасибо за участие, но в моей программе вместо str1, str2... более осмысленные имена и с массивом будет не так удобно.