LINUX.ORG.RU

Метки на С


0

0

Не совсем понятна работа с метками в С, к примеру так:
int main (int i)
{
printf ("\nSelect number\n");
printf ("\t\t");
switch ( i )
{
case 1: goto CIRC;
case 2: goto PAR;
default: printf("\nNo choice - no work !\n");
return;
}
}
CIRC:
some_function ()
{}
PAR:
other_function ()
{}

При компиляции идут ошибки:
label PAR used but not defined
Label CIRC used but not defined
syntax error befor ':' token
syntax error befor ':' token

В литеретуре так и не нашел как обьявлять метки...

anonymous

Метки, метки... Бросайте это вредное занятие, не используйте метки вообще. Тааакой аццтой. Практически во всех случаях можно обойтись без оных. Учитесь программировать прааавильно. Метки - это моветон.

anonymous
()

Не уверен что их можно объявлять вне функций. А вообще в литературе пишут, что метки==зло

roy ★★★★★
()

Ээ.. Ты С наверное с другим языком перепутал.

Ты обьявляешь метку перед определением функции, что является ошибкой синтаксиса.

Если хочешь goto, то обьявляй метку в пределах одной ф-ции. Если нужно goto между ф-циями, то используй longjmp().

А тебе надо не переходить по какой-то метке, а вызвать ф-цию. Например:

switch ( i )
{
case 1:
func_1();
break;
case 2:
func_2();
break;
default:
printf("\nNo choice - no work !\n");
break;
}

А вообще почитай что-нить по языку С. Кернигана и Ритчи чтоли..

OxiD ★★★★
()
Ответ на: комментарий от anonymous

> Метки, метки... Бросайте это вредное занятие, не используйте метки вообще. Тааакой аццтой. Практически во всех случаях можно обойтись без оных. Учитесь программировать прааавильно. Метки - это моветон.

Да ладно, кто как хочет, так и дро^H^H^H всмысле программирует. Кстати, вы на асме без меток писать пробовали? Нет? Попробуйте. :-)

human0id ★★★
()
Ответ на: комментарий от human0id

> Кстати, вы на асме без меток писать пробовали?

А Вы, сударь, не путайте Гоголя с Гегелем! :)

Pi ★★★★★
()

Совертшенно верно одно из предыдущих замчаний. В С метки имеют область видимости только внутри ОДНОЙ ФУНКЦИИ !!! То есть сказать goto на метку в др. функцию или как у Вас в примере в "глобальное пространство" низя...

kpblca
()
Ответ на: комментарий от human0id

human0id, Вы, простите, бредите? Где Си, а где Асм? Сравнили божий дар с яичницей. В Си ЛЮБАЯ задача (кроме, кажись одной казусной) может быть реализована без меток... Вы знаете, как воспринимает метки компилятор? Нет? Так полюбопытствуйте. Много нового узнаете...

anonymous
()
Ответ на: комментарий от Antichrist

дык ап том-то и речь: по другому никак - юзай, есть альтернатива - не порть читабельность /как минимум/

-вспомнив детство-

zx spectrum - от там сила была :)

Pi ★★★★★
()
Ответ на: комментарий от Pi

Goto не обязательно порят читабельность. Иногда они ее улучшают! Например при выходе из десятка вложенных циклов, или при переходе на обработчик ошибки.

OxiD ★★★★
()
Ответ на: комментарий от OxiD

> Если нужно goto между ф-циями, то используй longjmp().

Лучше уж сразу повесится, чем использовать longjamp() для этих целей - утечка стека будет. longjamp() имеент смысл использовать, если ты или потом опять таким же макаром вернешся в функцию, откуда пришел, или просто матюкнешся, освободишь ресурсы, и завершишь выполнение.

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

Spectr ★★★
()
Ответ на: комментарий от Antichrist

А будешь ругаться, покажу программу на бэйсике в 100 строк, с большим количеством гото. До сих пор удивляюсь, как такой примитив умудрились напрограмить так нечитаемо!

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

А буешь тут какашки показывать - покажу код, написанный Д.Е.Кнутом лично, с комментариями, содержащими злобный наезд на упёртых противников goto. ;)

Antichrist
()

в твоем случае метки не нужны, потом метки должны быть внутрях функции - иначе есстественно ошибки такие будут.

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

Да и не надо орать что метки отстой - они нужны в редких случаях - в сабжовом случае их лучше избегать - они там не нужны.

alphex_kaanoken ★★★
()
Ответ на: комментарий от alphex_kaanoken

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

anonymous
()
Ответ на: комментарий от Antichrist

Автоматы очень даже без goto программировать можно. Если что-то не выходит - просто надо подумать и упростить автомат.

Shaman007 ★★★★★
()
Ответ на: комментарий от Shaman007

Можно. Но неэффективно, и во многих случаях противоестественно.

На тему более другого применения меток - см. интерпретатор байткодов в Objective Caml. На gcc производительность шитого кода просто оббалденная...

Antichrist
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.