2013-07-25 2 views
0

Я работаю над проектом, что становится все более сложным. Проект состоит из независимых друг от друга разделов кода, содержащих множество математических вычислений, за которыми следует сложная генерация. Все это обернуто внутри сокета с pthread.Выполнение функции ведет себя как область

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

Main() -> гнездо -> нить -> обработки запроса -> один или несколько независимых секций

Я хотел вложить каждый независимый участок кода внутри функции и для этой функции наследовать переменные от функции вызывающего, но это не сработало.

Ниже упрощенная версия того, что я хочу добиться:

void func_a(){int c;b+=a;c=1;b+=c;} 
int main(){ 
int a,b,c; 
a=3;b=2;c=0; 
func_a(); 
printf("b:%d c:%d\n",b,c); 
return 1; 
} 

Приведенный выше код не работает, но это работает отлично, и делает то, что я хочу:

int main(){ 
int a,b,c; 
a=3;b=2;c=0; 
{int c;b+=a;c=1;b+=c;} 
printf("b:%d c:%d\n",b,c); 
return 1; 
} 

я мог просто поместите код для функции в файл, а затем сделайте {#include ...}, но, возможно, есть лучший способ сделать это?

Любые другие идеи и предложения по управлению такой вещью тоже ценятся.

Спасибо.

P.S.

Использование глобальной области применения не является вариантом из-за потоковой передачи. Просто передача переменных в функцию не является опцией, она будет принимать более 30 аргументов. У меня уже есть куча структуры, поэтому включение всех переменных в одну структуру не является опциональным эфиром.

+0

Если вы не заботитесь о переносимости, вы можете рассмотреть возможность использования поддержки вложенных функций gcc. –

+0

использование GCC локальная функция определять. – BLUEPIXY

ответ

0

Существуют различные способы достижения того, что вам нужно.

Первый - использовать gcc Вложенные функции. К сожалению, они нестандартны и, как таковые, полностью зависят от компилятора. Вы можете найти здесь информацию: Stack Overflow nested C function и по телефону GCC Nested functions manual. Если вам не нужна переносимость, это может быть приемлемым решением.

Другим решением может быть определение макроса с кодом вашей псевдофункции. Компилятор будет заменять каждый раз, когда вызывается макрос, и он автоматически наследует переменную, определенную в функции вызывающего.

Я переписал ваш пример с обоими решениями.

#include <stdio.h> 

#define FUNC_A() {int c;b+=a;c=1;b+=c;} 
#define FUNC_A2(_a,_b) {int c;_b+=_a;c=1;_b+=c;} 

int main(){ 
    int a,b,c; 
    void func_a(){int c;b+=a;c=1;b+=c;} 

    // nested solution 
    a=3;b=2;c=0; 
    func_a(); 
    printf("b:%d c:%d\n",b,c); 

    // macro solution 
    a=3;b=2;c=0; 
    FUNC_A(); 
    printf("b:%d c:%d\n",b,c); 

    // macro solution 
    a=3;b=2;c=0; 
    FUNC_A2(a,b); 
    printf("b:%d c:%d\n",b,c); 

    return 0; 
} 

Все решения имеют одинаковый результат. : D

+0

Одна из причин, по которой я пытался использовать функцию, - это то, что я ожидал, что компилятор будет лучше оптимизировать повторяющийся код. Я хотел бы придерживаться стандарта, поэтому любые мысли о том, насколько хорошо компилятор оптимизирует повторяющиеся области? – Ignas2526

+0

Используя решение с макросом, компилятор оптимизирует ваш код, как если бы он был написан в функции вызывающего абонента. Таким образом, вы избегаете всех накладных расходов для вызова функции (параметры push/pop, адреса в стеке).если вы используете переменную перед макросом, а затем используете ту же переменную в макросе, компилятор достаточно умен, чтобы держать его в регистре, без необходимости переходить в память. Если вы беспокоитесь о производительности, MACROS не повлияет на вашу производительность. –

+0

Работает ли он с макросами или вы нашли другое решение? –

Смежные вопросы