Dimentius 0 August 1, 2007 Posted August 1, 2007 · Report post Как правильно написать макрос со структурой, зависящей от параметра? Например, для циклов ожидания. Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен : #define DELAY(N)\ #if (N == 1)\ NOP;\ #elif (N > 1)\ delay_cycles(N>>1);\ #endif Quote Share this post Link to post Share on other sites More sharing options...
amusin 0 August 1, 2007 Posted August 1, 2007 · Report post Как правильно написать макрос со структурой, зависящей от параметра? Например, для циклов ожидания. Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен : #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 функцию и не парьте себе мозг. Quote Share this post Link to post Share on other sites More sharing options...
Andy_Mozzhevilov 0 August 1, 2007 Posted August 1, 2007 · Report post Как правильно написать макрос со структурой, зависящей от параметра? Например, для циклов ожидания. Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен : #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 нормальный компилер соптимизирует Quote Share this post Link to post Share on other sites More sharing options...
Dimentius 0 August 1, 2007 Posted August 1, 2007 · Report post Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L') #define DELAY(N)\ if (N == 1)\ NOP;\ else if (N > 1)\ delay_cycles(N>>1);\ #endif нормальный компилер соптимизирует Хм.. скорее всего соптимизирует. Но все же хотелось надеяться на препроцессор, неужели им никак? Quote Share this post Link to post Share on other sites More sharing options...
Andy_Mozzhevilov 0 August 1, 2007 Posted August 1, 2007 · Report post Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L') Хм.. скорее всего соптимизирует. Но все же хотелось надеяться на препроцессор, неужели им никак? Зачем? Важен результат, или способ, которым он достигнут? Quote Share this post Link to post Share on other sites More sharing options...
Dimentius 0 August 1, 2007 Posted August 1, 2007 · Report post Зачем? Важен результат, или способ, которым он достигнут? Результат, но читаемость листинга после препроцессора будет хуже. Все равно спасибо за идею. Quote Share this post Link to post Share on other sites More sharing options...
Andy_Mozzhevilov 0 August 1, 2007 Posted August 1, 2007 · Report post Результат, но читаемость листинга после препроцессора будет хуже. Все равно спасибо за идею. зачем его читать то? если не секрет? :) Quote Share this post Link to post Share on other sites More sharing options...
tag 0 August 1, 2007 Posted August 1, 2007 · Report post Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Как? Идея по ссылке http://mb9x.ginps.com/fujitsu/src/pin_macros.html А вообще сделайте inline функцию и не парьте себе мозг. ... inline функции не входят в стандартный С, а только в С++, и потом чем плох макровызов? Quote Share this post Link to post Share on other sites More sharing options...
Dimentius 0 August 1, 2007 Posted August 1, 2007 · Report post зачем его читать то? если не секрет? :) Обычно при отладке, читают и С и ASM Quote Share this post Link to post Share on other sites More sharing options...
Andy_Mozzhevilov 0 August 1, 2007 Posted August 1, 2007 · Report post Обычно при отладке, читают и С и ASM ну не думаю, что пытливый ум программиста введет в заблуждение такая ерунда Quote Share this post Link to post Share on other sites More sharing options...
Dimentius 0 August 1, 2007 Posted August 1, 2007 · Report post ну не думаю, что пытливый ум программиста введет в заблуждение такая ерунда В заблуждение не введет, но лишние данные будут присутствовать. А если учесть, что в макросе условий не два, а больше, и идет несколько макросов подряд? Тогда уже приличная "портянка" получается. Quote Share this post Link to post Share on other sites More sharing options...
reddot 0 August 20, 2007 Posted August 20, 2007 · Report post ... inline функции не входят в стандартный С, а только в С++ в стандартный си стандарта 99 года входят inline-функции. и набор компиляторов gnu с ними прекрасно справляется. Quote Share this post Link to post Share on other sites More sharing options...
WiseAlex 0 November 22, 2007 Posted November 22, 2007 (edited) · Report post 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 November 22, 2007 by WiseAlex Quote Share this post Link to post Share on other sites More sharing options...