Перейти к содержанию
    

Два входа в одну функцию на C

Занятная статья.

do{}while(0) я видел в чужих исходниках пару раз - и никак не мог понять зачем? Спасибо, разъяснили..

 

Сам я тоже сторонник везде ставить фигурные скобки..потому ниразу на подобную ошибку и не натыкался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам я тоже сторонник везде ставить фигурные скобки..потому ниразу на подобную ошибку и не натыкался.

А я, наоборот, сторонник минимализма. Не хочу писать ничего лишнего. Так мне красивее кажется.

А за ссылку на статью - спасибо, MrYuran!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну можно еще более универсальную штуку сочинить, типа:

 

typedef void (*pVoidFun)(void);           

void Control_Indication(pVoidFun p)
{
   if(p)
      p();
   
   Indication();
}

 

Тогда можно вызывать Control_Indication(NULL) - будет вызываться только Indication(), а при вызове типа Control_Indication(Control) сначала вызовется функция, адрес которой вы передали вызывающей функции, затем Indication().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...а при вызове типа Control_Indication(Control) сначала вызовется функция, адрес которой вы передали вызывающей функции...

Только Control() при этом должна быть отдельной функцией, иначе указатель на нее не создать. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без комментариев.

The Best :)

Почему же без комментариев? их есть!

ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без комментариев.

The Best :)

Почему же без комментариев? их есть!

ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы боретесь за экономию одной команды вызова и одной команды возврата?

Я не борюсь, а интересуюсь. Мне уже очевидно, что сделать нельзя.

 

ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

А вот здесь желательны комментарии. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему же без комментариев? их есть!

ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

 

Если их все объявить как static, то они на фиг никому будут не нужны, так как доступа к ним не будет. Можно (и идеологически правильно) Control() и Indication() объявить как static, чтобы к ним никто не совался кроме как через посредство Control_Indication().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Занятная статья.

do{}while(0) я видел в чужих исходниках пару раз - и никак не мог понять зачем? Спасибо, разъяснили..

Трюк, конечно, хороший, только надо тоже с аккуратностью применять, ибо:

1) Хороший компилятор выдаст предупреждение о том, что условие никогда НЕ выполняется, хотя все сделает правильно,

но лишние вопли придется давить локальными прагамами - некузяво :(.

2) Поганый компилятор (например, вот прямо сейчас работаю с рекордно поганым ImageCraft для M8C ) - такое НЕ соптимизирует -

вообще гнусно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2zltigo:

Хм...логично. Тогда напрашивается вопрос - и как жить? :crying:

Не использовать препроцессор прошу не предлагать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

Прокомментирую сам. Квалификатор static будет иметь смысл, если я эти функции заброшу в отдельный файл. Таких функций у меня несколько десятков, что ж, мне, столько файлов создавать? Не вижу смысла.

P.S. Где-то здесь и зарыта собака "неполной структурированности" языка C.

P.P.S. По поводу do {...} while (0) - а чем плохо показанное в той же статье строчкой выше {...} ? Разве кто-то заставляет писать I2C_CLOCK(); с точкой с запятой в конце?

Или в дефайне можно было задать

#define I2C_CLOCK(); {NOP(); SCL = 1; NOP(); SCL = 0;} Да, это не работает (кажется, в Hi-Tech PICC у меня получалось такое, а в Keil - нет)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или в дефайне можно было задать

#define I2C_CLOCK(); {NOP(); SCL = 1; NOP(); SCL = 0;}

Дык боролись за точку с запятой перед else - Где она?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм...логично. Тогда напрашивается вопрос - и как жить? :crying:

Думать по обстоятельствам.

Не использовать препроцессор прошу не предлагать :)

Почему? В числе решений по обстоятельствам, если компилятор не совсем дебильный, как вышеупомяутый, использовать принудительный inline.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятн...

Вот интересно - доживу я до момента когда в стандарт "С201x" включат шаблоны (template) на манер С++? И самое главное доживу ли я до появления компилятора, который будет это все поддерживать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...