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

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

На ассемблере у меня были подпрограммы, в которых сначала идет управление, а потом индикация. И можно было при желании вызвать только индикацию, и вернуться обычным возвратом в конце подпрограммы. Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?

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


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

Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?

Можно, но не так.

Сделать внутри switch(), а переключатель передавать снаружи.

Если тупо перейти по метке, то при операции RET произойдёт возврат хз куда, но не туда, куда нужно.

И вообще, пролог, эпилог - это всё нельзя пропускать.

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


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

The Best :)

Это - понятно. Так и делается, естественно. Вопрос, скорее, теоретический.

Имеется некоторая избыточность в виде лишнего вызова, если принять во внимание, что Contol без Indication не бывает.

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


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

Гость MALLOY2
Имеется некоторая избыточность в виде лишнего вызова

 

От лишнего вызова можно избавится поигравшись с компилятором (я не знаю какой он у вас, и какой проц, от этого многое зависит), попробовать функции объявить inlinе и .т.д. Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах.

 

В самом крайнем случае заменить функции дефайнами, и то прравельней будет.

 

#define   Indication() \
{\
   ...\
}\

#define  Control()\
{\
  ...\
}\

void Combo(void) //и никакого оверхеда только можно таких багов нахвататься
{
   Control();
   Indication();
}

 

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


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

я не знаю какой он у вас, и какой проц

И проц крутой - STM32F103, и компилятор крутой - Keil RealView MDK-ARM 4.12

Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах.

И делать так не хочу. А подумать не помешает... :)

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

Оверхед остается, если принять во внимание, что иногда мне нужно сразу Control-Indication(), а иногда только Indication().

 

Можно, но не так.

Сделать внутри switch(), а переключатель передавать снаружи.

Если с переключателем, так это еще более избыточно. Лучше уж 2 независимые функции.

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


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

В самом крайнем случае заменить функции дефайнами, и то прравельней будет.

Но только не так, как у вас!

Что, по-вашему, скажет компилер на конструкцию {};

 

Обычно макросы объявляют в скобках do{}while(0)

 

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

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


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

Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?
Метка в С имеет область видимость только внутри функции, поэтому переход в общем случае непосредственно по метке извне, вообще говоря, невозможен. В некоторых реализациях С есть нелокальный goto, но реализовано это как первоначальное запоминание контекста вызовом setjmp, с последующим переходом на запомненное состояние вызовом longjmp.

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


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

Гость MALLOY2
Но только не так, как у вас!

Что, по-вашему, скажет компилер на конструкцию {};

 

Про все компиляторы не скажу, но те с которыми я работаю такую конструкцию хавают.

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


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

А чем компилятору могут не понравиться скобки?

Есть нюансы.

Например, в конструкциях с if()

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


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

Есть вариант без switch

void Control_Indication(bool ctrl) 
{
if (ctrl) {
... // Control
  }
... // Indication
}

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


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

Есть нюансы.

Например, в конструкциях с if()

При do{}while(0) ньюансы с if пропадают?

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


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

При do{}while(0) ньюансы с if пропадают?

Обратим внимание, что использована конструкция do {…} while (0). Если бы мы ее не использовали, то постановка else в нашем условии:

 

if (...) I2C_CLOCK(); else return;

 

привела бы к сообщению компилятора об ошибке "inappropriate else". Все дело в том, что мы перед else и после '}' ставим ';', которая воспринимается компилятором как конец оператора if. Поэтому и использованы скобки в виде do {…} while.

отсюда

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


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

Гость MALLOY2

Так и есть это и есть всякие баги с макросами :),

 

Лично я исторически так сложилось всегда записываю только так

 

if(...)
{
  //даже если только 1 оператор используется.
}
else
{

}

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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