|
|
  |
Параметр макроса С, изменение макроса по передаваемому параметру |
|
|
|
Aug 1 2007, 09:54
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
Как правильно написать макрос со структурой, зависящей от параметра? Например, для циклов ожидания.
Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :
#define DELAY(N)\ #if (N == 1)\ NOP;\ #elif (N > 1)\ delay_cycles(N>>1);\ #endif
|
|
|
|
|
Aug 1 2007, 10:15
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165

|
Цитата(Dimentius @ Aug 1 2007, 15:54)  Как правильно написать макрос со структурой, зависящей от параметра? Например, для циклов ожидания.
Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :
#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 функцию и не парьте себе мозг.
|
|
|
|
|
Aug 1 2007, 10:26
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(Dimentius @ Aug 1 2007, 15:54)  Как правильно написать макрос со структурой, зависящей от параметра? Например, для циклов ожидания.
Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :
#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 нормальный компилер соптимизирует
--------------------
Пасу котов...
|
|
|
|
|
Aug 1 2007, 10:35
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
Цитата(amusin @ Aug 1 2007, 17:15)  Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L') Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:26)  Код #define DELAY(N)\ if (N == 1)\ NOP;\ else if (N > 1)\ delay_cycles(N>>1);\ #endif нормальный компилер соптимизирует Хм.. скорее всего соптимизирует. Но все же хотелось надеяться на препроцессор, неужели им никак?
|
|
|
|
|
Aug 1 2007, 10:45
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:38)  Зачем? Важен результат, или способ, которым он достигнут? Результат, но читаемость листинга после препроцессора будет хуже. Все равно спасибо за идею.
|
|
|
|
|
Aug 1 2007, 10:54
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(amusin @ Aug 1 2007, 14:15)  Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Как? Идея по ссылке http://mb9x.ginps.com/fujitsu/src/pin_macros.htmlА вообще сделайте inline функцию и не парьте себе мозг. ... inline функции не входят в стандартный С, а только в С++, и потом чем плох макровызов?
|
|
|
|
|
Aug 1 2007, 11:01
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:51)  зачем его читать то? если не секрет?  Обычно при отладке, читают и С и ASM
|
|
|
|
|
Aug 1 2007, 11:10
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
Цитата(Andy Mozzhevilov @ Aug 1 2007, 18:05)  ну не думаю, что пытливый ум программиста введет в заблуждение такая ерунда В заблуждение не введет, но лишние данные будут присутствовать. А если учесть, что в макросе условий не два, а больше, и идет несколько макросов подряд? Тогда уже приличная "портянка" получается.
|
|
|
|
|
Aug 20 2007, 08:28
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 7-06-06
Из: Зеленоград
Пользователь №: 17 843

|
Цитата ... inline функции не входят в стандартный С, а только в С++ в стандартный си стандарта 99 года входят inline-функции. и набор компиляторов gnu с ними прекрасно справляется.
|
|
|
|
|
Nov 22 2007, 15:12
|
Участник

Группа: Новичок
Сообщений: 36
Регистрация: 9-11-06
Пользователь №: 22 115

|
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)
Сообщение отредактировал WiseAlex - Nov 22 2007, 15:13
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|