LINUX.ORG.RU

Change GCC15

 


0

2

Читаю я статью на opennet: https://www.opennet.ru/opennews/art.shtml?num=63141

И вижу:

Реализованы элементы будущего стандарта C2Y (-std=c2y и -std=gnu2y): 
...
 Поддержка присвоения имён циклам для того, чтобы ссылаться на них в коде.
   outer: for (int i = 0; i < IK; ++ i) {
     switch (i) {
       case 1:
         break;       // jumps to CONT1
       case 2:
         break outer; // jumps to CONT2
     }
     // CONT1
   }
   // CONT2

Не понял. Это что еще за бред?

★★★★★
Ответ на: комментарий от MOPKOBKA

Тот что нравится и логично, вопросов не возникает, вопросы к странным ново введениям. Может это сделано для того чтобы народ больше забывал освобождать память?

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

Кто же выделяет память в цикле. Ну и связанное с выходом из цикла потерянное освобождение gcc -fanalyzer сразу найдет. Так что это вообще не проблема.

То что представлено по break outer, это лишь замена goto которое все и писали.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от MOPKOBKA

Это понятно, но по я не силен в этом но помню когда то очень давно был басик и там была номерация строк и goto, (все это было в 80х) и потом я читал книжки по cи и хорошо помню что там обсуждали что goto и прерывания цикла куда хз куда это плохой стиль программирования и так лучше не делать.

Есть оператор switch и внутри его case или прерывают это или внутри что то воротят.

Представьте себе цикл где по goto наружу куда то, потом по goto в другую … бред какой то :(

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

Выход из вложенных циклов на goto это классика С, так что ноль изменений семантический, и есть лишь синтаксическое. Выход через goto используется и в ядре ... и везде.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от alysnix

Что значит с точной? Если бы все писали бы точно то не было бы вопрос про освобождение памяти и прочего.

Хотя если они хотят ввести такой break а goto выкинуть вообще то в принципе это будет правильный шаг, по моему мнению.

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

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

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

локальные метки, видимые только в пределах блока.

и что? кого это спасает.

while (...) {
  break c1; ///так нельзя
  goto label0;  /// так можно
}

c1: while (...) {  
  break c1; ///так можно
  goto label0; ///так можно
}

label0:

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

Не понял. Это что еще за бред?

Несколько более красивый goto, но всё равно не нужно. Комитету нужно постоянно доказывать свою нужность и внедрять новые фичи в язык, иначе комитет распустят, как это уже произошло с ELF.

X512 ★★★★★
()

Не понял. Это что еще за бред?

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

anonymous
()

Меня несколько пугает, что компиляторы С++ становятся такими монстрами, что, наверное, уже нет ни одного человека на Земле, кто знал бы полностью, как такие компиляторы работают. И как доверять после этого компиляторам С++?

Ситуация усугубляется тем, что стандарты C++ становятся все сложнее и сложнее. Часто неоправданно сложнее.

По-моему уже пора пойти по обратному пути, когда новые стандарты C++ упрощали бы язык, а не усложняли. Может быть, так и будет когда-нибудь.

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

Это из джавы позаимствовали…

Да ладно? У Явы в 1996 году только первый релиз случился. Вот коротенький хелп к четвёртому Перлу датированный 1991 годом, в котором упоминаются меченые циклы, last и redo с метками (next [BLOCK] — это, возможно, ошибка, в пятом Перле после next можно поставить метку, а не блок).

P. S.

В Аде 95 операторы циклов тоже с метками:

loop_statement ::=
    [loop_statement_identifier:]
    [iteration_scheme] loop
    sequence_of_statements
    end loop [loop_identifier];

Равно как и оператор exit:

exit_statement ::=
    exit [loop_name] [when condition];
debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 1)
Ответ на: комментарий от anonymous

Меня несколько пугает, что компиляторы С++ становятся такими монстрами, что, наверное, уже нет ни одного человека на Земле, кто знал бы полностью, как такие компиляторы работают. И как доверять после этого компиляторам С++?

Прежде всего, нужно задаться этим же вопросом о процессорах.

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

Нет. Это фанатики цитируют бездумно не вникая в контекст. Современные компиляторы просто не дадут скомпилировать то что Дейкстра критиковал в своей статье.

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

Не куда хочешь — в строго в ограниченных пределах синтаксического дерева.

upd: А не, ошибся. C++ даёт ошибку, а C — только ворнинг.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 4)
Ответ на: комментарий от mx__

У меня почему то в мозгу сидело что goto в си нужно избегать.

Считается, что goto допустимо в двух случаях:

  1. Выход из вложенных циклов.

  2. Переход для освобождения памяти.

Вот ковыряю libssh, там регулярно встречается конструкция goto err, которая в самом конце подпрограммы очищает память.

И сам похожие конструкции пишу:

void my_scp_subroutine(                                                           
        const session_connect_info *info,                                       
        const char *path,                                                       
        char **err_msg)                                                         
{                                                                                                                                                        
        int rc;                                                                 
        ssh_session *session;                                                    
        ssh_scp *scp;                                                                                                               
                                                                                
        start_session(session, info, err_msg);                                  
        if (*err_msg)                                                           
                return;                                                         
        start_scp(scp, session, path, err_msg);                                 
        if (*err_msg)                                                           
                goto free_session;                                              
                                                                                
        ...
     
        if (rc != OK) {                                                                                                
                load_err_msg(err_msg, err_scp);                                 
                goto free_scp;                                                  
        }                                                                       
                                                                                
        ...

free_scp:                                                                                                                            
        ssh_scp_close(scp);                                                                                                          
        ssh_scp_free(scp);                                                      
free_session:                                                                                                                        
        ssh_disconnect(session);                                                                                                     
        ssh_free(session);
}
Jullyfish
()
Ответ на: комментарий от anonymous

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

И да, аналогия с громоздкостью С++ уместна. Мне даже понравилось.

Не нужно думать, что современный софт развивается в правильном направлении. Это совсем не так. Вопрос в том, что толком никто не знает, каким должен быть софт на самом деле. Но мы точно ушли в софтостроении куда-то не туда. Я кучу времени потратил на С++, .NET и Java. И мне совсем не нравится, во что они выродились.

anonymous
()