Jump to content
    

Параметр макроса С

Как правильно написать макрос со структурой, зависящей от параметра?

Например, для циклов ожидания.

 

Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :

 

#define DELAY(N)\

#if (N == 1)\

NOP;\

#elif (N > 1)\

delay_cycles(N>>1);\

#endif

Share this post


Link to post
Share on other sites

Как правильно написать макрос со структурой, зависящей от параметра?

Например, для циклов ожидания.

 

Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :

 

#define DELAY(N)\

#if (N == 1)\

NOP;\

#elif (N > 1)\

delay_cycles(N>>1);\

#endif

 

Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Как? Идея по ссылке http://mb9x.ginps.com/fujitsu/src/pin_macros.html

 

А вообще сделайте inline функцию и не парьте себе мозг.

Share this post


Link to post
Share on other sites

Как правильно написать макрос со структурой, зависящей от параметра?

Например, для циклов ожидания.

 

Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :

 

#define DELAY(N)\

#if (N == 1)\

NOP;\

#elif (N > 1)\

delay_cycles(N>>1);\

#endif

#define DELAY(N)\
    if (N == 1)\
        NOP;\
    else if (N > 1)\
       delay_cycles(N>>1);\
#endif

нормальный компилер соптимизирует

Share this post


Link to post
Share on other sites

Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно.

Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L')

 

#define DELAY(N)\
    if (N == 1)\
        NOP;\
    else if (N > 1)\
       delay_cycles(N>>1);\
#endif

нормальный компилер соптимизирует

Хм.. скорее всего соптимизирует.

 

Но все же хотелось надеяться на препроцессор, неужели им никак?

Share this post


Link to post
Share on other sites

Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L')

Хм.. скорее всего соптимизирует.

 

Но все же хотелось надеяться на препроцессор, неужели им никак?

 

Зачем? Важен результат, или способ, которым он достигнут?

Share this post


Link to post
Share on other sites

Зачем? Важен результат, или способ, которым он достигнут?

Результат, но читаемость листинга после препроцессора будет хуже.

Все равно спасибо за идею.

Share this post


Link to post
Share on other sites

Результат, но читаемость листинга после препроцессора будет хуже.

Все равно спасибо за идею.

зачем его читать то? если не секрет? :)

Share this post


Link to post
Share on other sites

Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Как? Идея по ссылке http://mb9x.ginps.com/fujitsu/src/pin_macros.html

 

А вообще сделайте inline функцию и не парьте себе мозг.

 

 

... inline функции не входят в стандартный С, а только в С++, и потом чем плох макровызов?

Share this post


Link to post
Share on other sites

Обычно при отладке, читают и С и ASM

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

Share this post


Link to post
Share on other sites

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

В заблуждение не введет, но лишние данные будут присутствовать. А если учесть, что в макросе условий не два, а больше, и идет несколько макросов подряд? Тогда уже приличная "портянка" получается.

Share this post


Link to post
Share on other sites

... inline функции не входят в стандартный С, а только в С++
в стандартный си стандарта 99 года входят inline-функции. и набор компиляторов gnu с ними прекрасно справляется.

Share this post


Link to post
Share on other sites

boost::preprocessor

там есть и IF и прочее (вплоть до циклов (мне даже приходилось делать вложенные :) ) )

если лень таскать целый целый boost можно практически безболезненно выдрать пару файлов из preprocessor и в путь

--

основная идея в следующем

 

#define if0(Param1,Param2) Param2

#define if1(Param1,Param2) Param1

#define if2(Param1,Param2) Param1

...

 

#define if(N,b,c) if##N(b,c)

Edited by WiseAlex

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...