искуство написания макроса
От: Lepsik Индия figvam.ca
Дата: 18.10.04 18:45
Оценка:
возможно ли написание макроса разворачивающего выражени типа
"abcd"

в
{'a', 'b', 'c', 'd'}
?
Re: искуство написания макроса
От: yxiie Украина www.enkord.com
Дата: 18.10.04 18:55
Оценка:
Здравствуйте, Lepsik, Вы писали:

L>возможно ли написание макроса разворачивающего выражени типа
"abcd"

L>в
{'a', 'b', 'c', 'd'}
?


нет
... << RSDN@Home 1.1.3 stable >>
Re[2]: искуство написания макроса
От: McSeem2 США http://www.antigrain.com
Дата: 18.10.04 19:08
Оценка: +1 :))) :)
Здравствуйте, yxiie, Вы писали:

L>>возможно ли написание макроса разворачивающего выражени типа "abcd"

L>>в {'a', 'b', 'c', 'd'}?

Y>нет


...И я вспомнил Четырнадцатый том сочинений Боконона — прошлой
ночью я его прочел весь целиком. Четырнадцатый том озаглавлен
так:
"Может ли разумный человек, учитывая опыт прошедших веков,
питать хоть малейшую надежду на светлое будущее человечества?"
Прочесть Четырнадцатый том недолго. Он состоит всего из
одного слова и точки: "Нет".

-- Курт Воннегут, Колыбель для кошки.

Я же говорил, что сишний препроцессор — отстой. И его не исправить никакими бустами. Нужна новая концепция, причем, лучше бы — не "препроцессора", а просто макро-процессора, встроенного в компилятор.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: искуство написания макроса
От: yxiie Украина www.enkord.com
Дата: 18.10.04 20:20
Оценка: 16 (5)
Здравствуйте, McSeem2, Вы писали:

MS>Здравствуйте, yxiie, Вы писали:


L>>>возможно ли написание макроса разворачивающего выражени типа "abcd"

L>>>в {'a', 'b', 'c', 'd'}?

Y>>нет


MS>

...И я вспомнил Четырнадцатый том сочинений Боконона — прошлой
MS>ночью я его прочел весь целиком. Четырнадцатый том озаглавлен
MS>так:
MS> "Может ли разумный человек, учитывая опыт прошедших веков,
MS>питать хоть малейшую надежду на светлое будущее человечества?"
MS> Прочесть Четырнадцатый том недолго. Он состоит всего из
MS>одного слова и точки: "Нет".

MS>-- Курт Воннегут, Колыбель для кошки.

MS> Я же говорил, что сишний препроцессор — отстой. И его не исправить никакими бустами. Нужна новая концепция, причем, лучше бы — не "препроцессора", а просто макро-процессора, встроенного в компилятор.


McSeem2, это уже вызов

по большому счету на ответ нет вопроса в идеальном виде, но решить его можно:

#include <iostream>

#include <boost/preprocessor/repetition/enum.hpp>

#define UNWIND_STR_PARAM(Z, N, STR) ((N>sizeof(STR))?'\0':STR[N])

#define UNWIND_STR_MAX_LEN 80

#define UNWIND_STR(STR) \
    { BOOST_PP_ENUM(80, UNWIND_STR_PARAM, STR) }

char s[]=UNWIND_STR("abcd");

int main() {
    std::cout<<s<<std::endl; 
    return 0;
}


так что кричать "препроцессор — отстой" пока рано



Здравствуйте, Lepsik, Вы писали:

L>возможно ли написание макроса разворачивающего выражени типа
"abcd"

L>в
{'a', 'b', 'c', 'd'}
?


я так понял вам нужно для этого
Автор: Lepsik
Дата: 15.10.04
?
если да, то мой вариант вам подойдет. вот только измените константу UNWIND_STR_MAX_LEN если планируете обрабатывать строки длинной более 80 символов.

ну и соответственно добавьте шифрование в UNWIND_STR_PARAM
... << RSDN@Home 1.1.3 stable >>
Re[4]: искуство написания макроса
От: c-smile Канада http://terrainformatica.com
Дата: 18.10.04 20:43
Оценка:
Здравствуйте, yxiie, Вы писали:

Ну ты шаман!

Я предлагаю все нижеследующее заменить на
char s[]="abcd";

Так как оно эквивалентно всему твоему безобразию заканчивающимся
на
char s[]=UNWIND_STR("abcd");




Характерный пример кстати...


Y>
Y>#include <iostream>

Y>#include <boost/preprocessor/repetition/enum.hpp>

Y>#define UNWIND_STR_PARAM(Z, N, STR) ((N>sizeof(STR))?'\0':STR[N])

Y>#define UNWIND_STR_MAX_LEN 80

Y>#define UNWIND_STR(STR) \
Y>    { BOOST_PP_ENUM(80, UNWIND_STR_PARAM, STR) }

Y>char s[]=UNWIND_STR("abcd");

Y>int main() {
Y>    std::cout<<s<<std::endl; 
Y>    return 0;
Y>}
Y>


Y>так что кричать "препроцессор — отстой" пока рано
Re[5]: искуство написания макроса
От: yxiie Украина www.enkord.com
Дата: 18.10.04 20:56
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, yxiie, Вы писали:


CS>Ну ты шаман!


CS>Я предлагаю все нижеследующее заменить на

CS>
CS>char s[]="abcd";
CS>

CS>Так как оно эквивалентно всему твоему безобразию заканчивающимся
CS>на
CS>
CS>char s[]=UNWIND_STR("abcd");
CS>


CS>


CS>Характерный пример кстати...



ну дак человеку шаманство и нужно
он ведь эти строки потом шифровать будет. вот я почву для шифровки и подготовил
... << RSDN@Home 1.1.3 stable >>
Re[4]: искуство написания макроса
От: Lepsik Индия figvam.ca
Дата: 18.10.04 21:05
Оценка:
Здравствуйте, yxiie, Вы писали:
L>>возможно ли написание макроса разворачивающего выражени типа
"abcd"

L>>в
{'a', 'b', 'c', 'd'}
?

Y>я так понял вам нужно для этого
Автор: Lepsik
Дата: 15.10.04
?

Y>если да, то мой вариант вам подойдет. вот только измените константу UNWIND_STR_MAX_LEN если планируете обрабатывать строки длинной более 80 символов.
Y>ну и соответственно добавьте шифрование в UNWIND_STR_PARAM

К сожалению ваш пример не взирая кодирую или нет осталяет в ресурсах примерно 50 копий исходной строки.
Даже если свести линковщиков в одну строку, все равно открыто.
Re[4]: искуство написания макроса
От: McSeem2 США http://www.antigrain.com
Дата: 18.10.04 21:06
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>так что кричать "препроцессор — отстой" пока рано


Отстой, отстой. А как не остой, конечно отстой
Ассемблерным макропроцессором подобные вещи делаются легко и непринужденно, а здесь — просто "убиться веником"

Да и вообще, это плохая идея — раздельное пре-процессирование. О макросах должен знать сам компилятор, а не препроцессор. Ну чтобы хотя бы для того, чтобы макросы и определения попадали в отладочную информацию. Соблюдение пространства имен, опять же.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: искуство написания макроса
От: yxiie Украина www.enkord.com
Дата: 18.10.04 21:56
Оценка: 1 (1)
Здравствуйте, Lepsik, Вы писали:

L>Здравствуйте, yxiie, Вы писали:

L>>>возможно ли написание макроса разворачивающего выражени типа
"abcd"

L>>>в
{'a', 'b', 'c', 'd'}
?

Y>>я так понял вам нужно для этого
Автор: Lepsik
Дата: 15.10.04
?

Y>>если да, то мой вариант вам подойдет. вот только измените константу UNWIND_STR_MAX_LEN если планируете обрабатывать строки длинной более 80 символов.
Y>>ну и соответственно добавьте шифрование в UNWIND_STR_PARAM

L>К сожалению ваш пример не взирая кодирую или нет осталяет в ресурсах примерно 50 копий исходной строки.

L>Даже если свести линковщиков в одну строку, все равно открыто.

похоже что так. ну в принципе это было шаманство, и даже если сделать enable string pooling исправить не получится
средствами С++ решить врядли решаемо.
но если уже так сильно нужно можно воспользоваться таким perl скриптом


# --- encode.pl ------------------------

sub myencode(@) {
    return ord($_[0])^0xFF;
}

open(F,$ARGV[0]) || die;
open(Fo,'>'.$ARGV[1]);
$src="";
$dst="";
while ($line=<F>) {
    $src.=$line;
    if ($line=~/(.*)__XOR_STR\(\"(.*)\"\)(.*)/) {
        $res="";
        for ($i=0; $i<length($2); ++$i) {
            $res.="," if ($i>0);
            $res.=myencode(substr($2, $i, 1));
        }
        $dst.="$1\{".$res."\}$3";
    } else {
        $dst.=$line;
    }
}
print Fo $dst;
close(F);
close(Fo);


использовать:

perl encode.pl input.cpp output.cpp


он код вида

char s[]=__XOR_STR("abcd");


заменит на

char s[]={158,157,156,155};


в функции myencode можешь изменить алгоритм шивровки на что-то более интересное нежели xor.
... << RSDN@Home 1.1.3 stable >>
Re[5]: искуство написания макроса
От: yxiie Украина www.enkord.com
Дата: 18.10.04 21:56
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Здравствуйте, yxiie, Вы писали:


Y>>так что кричать "препроцессор — отстой" пока рано


MS>Отстой, отстой. А как не остой, конечно отстой

MS>Ассемблерным макропроцессором подобные вещи делаются легко и непринужденно, а здесь — просто "убиться веником"

свои задачи я сишным препроцессором решаю тоже легко и непринужденно.

MS>Нужна новая концепция, причем, лучше бы — не "препроцессора", а просто макро-процессора, встроенного в компилятор.


если не хватает сяшного препроцессора и нужна новая концепция — прикрути perl в качестве препроцессора как тебе такая концепция?

MS>Да и вообще, это плохая идея — раздельное пре-процессирование. О макросах должен знать сам компилятор, а не препроцессор. Ну чтобы хотя бы для того, чтобы макросы и определения попадали в отладочную информацию. Соблюдение пространства имен, опять же.


есть такая замечательная вещь... template называется.... слыхал?
... << RSDN@Home 1.1.3 stable >>
Re[6]: искуство написания макроса
От: McSeem2 США http://www.antigrain.com
Дата: 18.10.04 22:16
Оценка:
Здравствуйте, yxiie, Вы писали:

MS>>Нужна новая концепция, причем, лучше бы — не "препроцессора", а просто макро-процессора, встроенного в компилятор.


Y>если не хватает сяшного препроцессора и нужна новая концепция — прикрути perl в качестве препроцессора как тебе такая концепция?


Не хочу. Это будет возврат к временам первого компилятора C++, реализованного как препроцессор для C.

MS>>Да и вообще, это плохая идея — раздельное пре-процессирование. О макросах должен знать сам компилятор, а не препроцессор. Ну чтобы хотя бы для того, чтобы макросы и определения попадали в отладочную информацию. Соблюдение пространства имен, опять же.


Y>есть такая замечательная вещь... template называется.... слыхал?


Речь идет не о шаблонах, а именно о макросах. Это несколько разные вещи. Ну хорошо,я согласен на то, чтобы концепция шаблонов была расширена мощными макро-средствами, включая конкатенацию, repeat/enumerate/etc. А define-макросы запретить.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: искуство написания макроса
От: McSeem2 США http://www.antigrain.com
Дата: 19.10.04 00:57
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Ну ты шаман!


CS>Я предлагаю все нижеследующее заменить на

CS>
CS>char s[]="abcd";
CS>

CS>Так как оно эквивалентно всему твоему безобразию заканчивающимся
CS>на
CS>
CS>char s[]=UNWIND_STR("abcd");
CS>


А если так:
int s[]=UNWIND_STR("abcd");


Не все так просто. Уважаемый Ухие привел просто демонстрацию метода. Но все равно я не завидую тому, кому придется разбираться с подобными наворотами. Это чисто гимнастика для ума, которая не должна применяться на практике. Ибо нефиг.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[6]: искуство написания макроса
От: yxiie Украина www.enkord.com
Дата: 19.10.04 08:00
Оценка:
Здравствуйте, yxiie, Вы писали:

[]

поэтому можно выделить все строки в один .h файл, и его парсить таким скриптом в pre-build step
... << RSDN@Home 1.1.3 stable >>
Re[6]: искуство написания макроса
От: Lepsik Индия figvam.ca
Дата: 19.10.04 14:56
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>похоже что так. ну в принципе это было шаманство, и даже если сделать enable string pooling исправить не получится

Y>средствами С++ решить врядли решаемо.

не — обрабатывать отдельным слоем я не хочу. все должно быть просто.
у меня есть еще пара идей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.