Цитата(SasaVitebsk @ Nov 19 2006, 21:37)

Или каков аналог в Си конструкции Pascal
procedure A;
var x,y,z : integer;
procedure B;
begin
end;
begin
end;
На первую часть уже ответили - постарайтесь либо запихнуть B() в макросы, либо всё нужное внутри A() упихать в структуру и передавать указатель на неё. Кстати, если B() при этом будет static, то умный компилятор может сам её проинлайнить с оптимизацией обращений и "основное" тело выбросить.
Если компилятор С (не С++, где это и так есть) поддерживает стандарт C99, то тогда вообще можно
static inline B(a_vars_struct *p)
и он будет обязан проинлайнить.
А вот аналога вложенных функций паскаля в стандартном С нет - есть только в расширениях GCC.
Код
void A() {
int x, y, z;
static inline void B(void) {
x = y + z;
}
// ...
B();
// ...
}
Вложенную функцию очень желательно объявлять static inline - иначе для неё генерируется отдельное тело с раскруткой указателя на стековый фрейм охватывающей функции и всё становится большим и тормозным.
Но если предполагается передача указателя на вложенную функцию куда-то дальше, то тогда от static придётся отказаться (inline можно оставить - тогда "местные" вызовы проинлайнятся, но и отдельное тело будет для "удалённых" вызовов).
Навскидочно-тупой пример (именно тут проще "традиционно"):
Код
int * C(int *p, int len, uint8_t (*pf)(int i) ) {
while(len--) {
if( pf(*p) == 0 ) return p;
++p;
}
return 0;
}
void A(ну какие-то аргументы) {
int min, max, len;
int *ptr;
int *pbuf;
uint8_t B(int i) { retrun ( i >= min && i <= max); }
// ...
ptr = C( pbuf, len, B);
// ...
}