|
|
  |
Два входа в одну функцию на C, возможно ли такое? |
|
|
|
Dec 2 2010, 11:43
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Код void Indication(void) { ... }
void Control(void) { ... }
void Combo(void) { Control(); Indication(); } Без комментариев. The Best
|
|
|
|
|
Dec 2 2010, 11:47
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ViKo @ Dec 2 2010, 14:28)  Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку? Можно, но не так. Сделать внутри switch(), а переключатель передавать снаружи. Если тупо перейти по метке, то при операции RET произойдёт возврат хз куда, но не туда, куда нужно. И вообще, пролог, эпилог - это всё нельзя пропускать.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Dec 2 2010, 11:57
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Имеется некоторая избыточность в виде лишнего вызова От лишнего вызова можно избавится поигравшись с компилятором (я не знаю какой он у вас, и какой проц, от этого многое зависит), попробовать функции объявить inlinе и .т.д. Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах. В самом крайнем случае заменить функции дефайнами, и то прравельней будет. Код #define Indication() \ {\ ...\ }\
#define Control()\ {\ ...\ }\
void Combo(void) //и никакого оверхеда только можно таких багов нахвататься { Control(); Indication(); }
|
|
|
|
|
Dec 2 2010, 12:15
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(MALLOY2 @ Dec 2 2010, 13:57)  я не знаю какой он у вас, и какой проц И проц крутой - STM32F103, и компилятор крутой - Keil RealView MDK-ARM 4.12 Цитата Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах. И делать так не хочу. А подумать не помешает...  Цитата В самом крайнем случае заменить функции дефайнами, и то правильней будет ... и никакого оверхеда только можно таких багов нахвататься Оверхед остается, если принять во внимание, что иногда мне нужно сразу Control-Indication(), а иногда только Indication(). Цитата(MrYuran @ Dec 2 2010, 13:47)  Можно, но не так. Сделать внутри switch(), а переключатель передавать снаружи. Если с переключателем, так это еще более избыточно. Лучше уж 2 независимые функции.
|
|
|
|
|
Dec 2 2010, 12:15
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(MALLOY2 @ Dec 2 2010, 14:57)  В самом крайнем случае заменить функции дефайнами, и то прравельней будет. Но только не так, как у вас! Что, по-вашему, скажет компилер на конструкцию {}; Обычно макросы объявляют в скобках do{}while(0) А лучше всё-таки макросами не злоупотреблять, во избежание.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Dec 2 2010, 12:38
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Но только не так, как у вас! Что, по-вашему, скажет компилер на конструкцию {}; Про все компиляторы не скажу, но те с которыми я работаю такую конструкцию хавают.
|
|
|
|
|
Dec 2 2010, 13:16
|

Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966

|
Цитата(MrYuran @ Dec 2 2010, 15:55)  Есть нюансы. Например, в конструкциях с if() При do{}while(0) ньюансы с if пропадают?
|
|
|
|
|
Dec 2 2010, 13:31
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Так и есть это и есть всякие баги с макросами  , Лично я исторически так сложилось всегда записываю только так Код if(...) { //даже если только 1 оператор используется. } else {
}
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|