2014-10-02 2 views
-4

возможно написать макрос, который генерирует из этого вызоваC препроцессорный макрос для генерации функций?

WATCH(l1=g1+g2*g3) 

этот код?

TRACE(g1); 
TRACE(g2); 
TRACE(g3); 
l1=g1+g2*g3; 
TRACE(l1); 

Имейте это в виду, если это возможно вообще, если да, пожалуйста, укажите мне в правильном направлении.

Программное обеспечение: рука-Linux-гну-GCC, версия 4.9.1, Target является Cortex-M3 совет Язык C99

С уважением, memic

+0

Рассмотрите возможность использования какого-либо другого препроцессора (например, [GPP] (http://en.nothingisreal.com/wiki/GPP) или 'm4') и/или сгенерируйте свой код на C++ вашей специализированной программой. –

+1

Избегайте использования препроцессора для сложных вещей.Трудно отлаживать, а также у вас нет роскоши проверки типов. –

+2

Я подозреваю, что это проблема XY. В C++ мы, вероятно, решаем проблему X, объявляя все 4 vars как настраиваемый тип, чтобы его операторы могли быть перегружены для печати аргументов. – MSalters

ответ

0

No. Макрос будет начать #define WATCH(X) ..., и вы не можете разобрать X в препроцессоре.

0

Это непросто (и, вероятно, невозможно, как вы просите). Может быть, вы хотите, чтобы некоторые aspect-oriented programming

Рассмотрите возможность использования некоторого другой препроцессора (например, GPP или m4) и/или сгенерировать C++ кода с помощью какой-либо специальной программы или сценария, который написал бы.

Вы также можете настроить свой GCC компилятор (по крайней мере, на Linux, с недавним gcc или g++) с использованием MELT. Это требует понимания внутренних компонентов GCC (в частности, представления Gimple) и написания в MELT дополнительного пакета оптимизации, который бы сделал преобразование (так, вероятно, несколько недель работы).

+0

havent слышал о аспектно-ориентированном программировании в c – memic

+0

@memic исходный тег был C++. –

+0

да извините, что – memic

0

Это не возможно с препроцессором в одиночку, но это возможно с некоторыми трюками TMP как шаблон выражения, например, вы можете посмотреть на Catch библиотеки:

TEST_CASE("Factorials are computed", "[factorial]") { 
    REQUIRE(Factorial(0) == 1); 
    REQUIRE(Factorial(1) == 1); 
    REQUIRE(Factorial(2) == 2); 
    REQUIRE(Factorial(3) == 6); 
    REQUIRE(Factorial(10) == 3628800); 
} 

Это может произвести сообщение, как показано ниже:

Example.cpp:9: FAILED: 
    REQUIRE(Factorial(0) == 1) 
with expansion: 
    0 == 1 

Обратите внимание, что последняя строка 0 == 1, как это может говорит о том, что LHS является 0, RHS является 1, и оператор ==?, ну, это сделать ne через шаблон выражения, а комбинация с макросом просто упрощает ее использование.

+0

OP использует C (C99) - не уверен, почему вопрос отмечен как C++. –

+0

@PaulR right, corrected, thx – memic

0

Это не возможно (afaics) с операторами в вызове макроса. Но вы можете определить макрос с такой функцией, как подпись:

#define WATCH(l1,g1,g2,g3) \ 
TRACE(g1); \ 
TRACE(g2); \ 
TRACE(g3); \ 
l1=g1+g2*g3; \ 
TRACE(l1) 

Это поможет? И как всегда составные операторы, я рекомендовал бы, чтобы обернуть их в делать ... в то время как петли, как

#define WATCH(l1,g1,g2,g3) \ 
do { \ 
    TRACE(g1); \ 
    TRACE(g2); \ 
    TRACE(g3); \ 
    l1=g1+g2*g3; \ 
    TRACE(l1); \ 
} while(0) 

Так что он ведет себя как единая команда; Представьте себя

if(condition) WATCH(l1,g1,g2,g3); 

С незащищенным составом.

+0

Да, это похоже на то, что предложил пользователь2501 .. thx :) Проблема в том, что операторы (+, *) внутри макроса. – memic

+0

Вы имеете в виду вызовы формы 'WATCH (l1 = g1 + g2 * g3) 'уже находятся в коде, и вы не можете вручную их изменить? Затем вам нужна более совершенная обработка текста, чем cpp (patch, sed) как часть вашей сборки. –

+0

yes l1 + g2 + g * g3 - это код, который я хочу выполнить, а также трассировка vars справа до и a слева после выполнения строки – memic

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