C++ как препроцессор в C

Когда я говорю "С++ - это препроцессор в С" - это значит, что в принципе можно написать программу c++2c.exe и результат ее работы компилировать любым С-компилятором.
При таком подходе вообще не существует компиляторов. Можно написать программу c2asm.exe, которая будет переводить все в ассемблер (причем даже без специфики типа MS/Turbo, а под любой). Это тоже будет препроцессор?
PS Слова компилятор, препроцессор, конвертор, ... я, как-то, не очень различаю

следующая программа:
class MyClass {public: MyClass{} ~MyClass{}};
void FirstFunc
{
какой-то код
try
{
MyClass c1;
какой-то код2;
throw 1;
какой-то код3;
}
catch (...)
{
}
}
преобразуется в следующий c-ишный код:
void FirstFunc
{
какой-то код;
запомним состояние стека (q1);
вызвать функцию MyClass::MyClass;
запомнить, что необходимо вызвать функцию MyClass::~MyClass;
какой-то код2;
//throw 1;
востановить состояние стека q1, вызвав все запомненные функции, которые были после этого состояния
}
ЗЫ: Кстати, про Java на уровне JVM - тут ... хм...
запомним состояние стека (q1);
Радость exception-ов в С++ как раз в том и состоит, что если исключения не происходит, то накладных расходов нет вообще. Этим то они и лучше, чем бесконечные С-шные
if( (ret = f != 0 )
return(ret);
не говоря уж о простоте программирования.
А в том, что на С можно написать интерпретатор обработки исключений, я не сомневаюсь.
При хорошей реализации накладные расходы будут минимальны, а то и вовсе равны.
гон, посмотри дизассемблер
там есть инструкция типа mov fs:xx, чего-то там
это и есть сохранение состояния, а также запись о том, какие деструкторы необходимо будет вызвать
ps
информация о том, какие деструкторы в каком момент надо вызвать, подготавливается на этапе компиляции, в программе на C - это также можно сделать заранее.
там есть инструкция типа mov fs:xx, чего-то там
Вот западло!


void __attribute__noinline h(void)
{
throw E;
}
void __attribute__noinline f(void)
{
A a;
h;
}
......
.globl _Z1fv
.type _Z1fv, @function
_Z1fv:
.LFB1633:
pushl %ebp
.LCFI6:
movl %esp, %ebp
.LCFI7:
subl $40, %esp
.LCFI8:
movl %ebx, -4(%ebp) ; ВОТ ЭТОТ
.LCFI9:
.LEHB0:
call _Z1hv
......


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



setjmp/longjmp... Правда все это довольно медленно...
Это немного не то. Связка C -> Asm -> Binary транзитивна, то есть результат получится одинаковый, если компилировать поэтапно или сразу. И можно было бы расчитывать на то, что C++ -> C -> Binary тоже будет обладать таким свойством (если конечно оптимизирующие блоки у С++ и у С компиляторов одинаковые). Или ты имеешь в виду "Правда все это довольно медленно [компилируется]"?


Оставить комментарий
rosali
Несколько раз, в том числе и здесь, кажется, слышал мысль, что C++ это всего лишь препроцессор в C. По началу поверил:Но вот сейчас задумался, а на что в С можно отобразить exception handling?