Сообщение Re[8]: Феерия с inline в C99 и GCC 5.1 от 05.07.2015 10:43
Изменено 05.07.2015 10:52 watchmaker
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, watchmaker, Вы писали:
К>>>Но синтаксически... сломали совместимость.
W>>Сломали совместимость с чем? Такое поведение у inline в стандарте языка было всегда
К>http://ideone.com/x4thLo — C89 — ok
И почему ты решил, что по ссылке с89?
Это невалидный код. По стандарту он даже не скомпилируется.
Вот что думает gcc-4.8 -std=c89 про строчку c inline:
А вот что думает clang-3.5 -std=c89:
Это уже не говоря о том, что есть и куда более важное несоответствие с c89:
gcc
clang
К>Хочешь сказать, что инстанцирование &foo — это добрая воля и личная инициатива компилятора?
В с99 инстанциирования не будет по стандарту (и у компиляторов с этим нет проблем — не делать как-то всегда проще чем наоборот что-то делать).
В с89 такой код невалиден.
К>(Аналогичная ситуация со статическими членами-константами в С++ однозначно приводит к ошибке линковки).
Однозначно — слишком сильно сказано. Никто не гарантирует, что такая ситуация не приведёт. И, конечно, это нужно исправлять. Но достаточно часто не приводит из-за слишком умного оптимизатора, и забытое определение может быть обнаружено совсем не сразу.
К>Здравствуйте, watchmaker, Вы писали:
К>>>Но синтаксически... сломали совместимость.
W>>Сломали совместимость с чем? Такое поведение у inline в стандарте языка было всегда
К>http://ideone.com/x4thLo — C89 — ok
И почему ты решил, что по ссылке с89?
Это невалидный код. По стандарту он даже не скомпилируется.
Вот что думает gcc-4.8 -std=c89 про строчку c inline:
ll.c:3:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
inline void foo() { printf("foo\n"); }
^
А вот что думает clang-3.5 -std=c89:
ll.c:3:1: error: unknown type name 'inline'
inline void foo() { printf("foo\n"); }
^
Это уже не говоря о том, что есть и куда более важное несоответствие с c89:
gcc
ll.c:8:5: error: expected expression before ‘/’ token
// your code goes here
^
clang
ll.c:8:5: error: // comments are not allowed in this language
// your code goes here
^
К>Хочешь сказать, что инстанцирование &foo — это добрая воля и личная инициатива компилятора?
В с99 инстанциирования не будет по стандарту (и у компиляторов с этим нет проблем — не делать как-то всегда проще чем наоборот что-то делать).
В с89 такой код невалиден.
К>(Аналогичная ситуация со статическими членами-константами в С++ однозначно приводит к ошибке линковки).
Однозначно — слишком сильно сказано. Никто не гарантирует, что такая ситуация не приведёт. И, конечно, это нужно исправлять. Но достаточно часто не приводит из-за слишком умного оптимизатора, и забытое определение может быть обнаружено совсем не сразу.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, watchmaker, Вы писали:
К>>>Но синтаксически... сломали совместимость.
W>>Сломали совместимость с чем? Такое поведение у inline в стандарте языка было всегда
К>http://ideone.com/x4thLo — C89 — ok
И почему ты решил, что по ссылке с89? Там как раз тот самый «язык Си с лямбда-функциями и компанией».
В c89 это невалидный код. По стандарту он даже не скомпилируется.
Вот что думает gcc-4.8 -std=c89 про строчку c inline:
А вот что думает clang-3.5 -std=c89:
Это уже не говоря о том, что есть и куда более важное несоответствие с c89:
gcc
clang
К>Хочешь сказать, что инстанцирование &foo — это добрая воля и личная инициатива компилятора?
В с99 инстанциирования не будет по стандарту (и у компиляторов с этим нет проблем — не делать как-то всегда проще чем наоборот что-то делать).
В с89 такой код невалиден.
К>(Аналогичная ситуация со статическими членами-константами в С++ однозначно приводит к ошибке линковки).
Однозначно — слишком сильно сказано. Никто не гарантирует, что такая ситуация не приведёт. И, конечно, это нужно исправлять. Но достаточно часто не приводит из-за слишком умного оптимизатора, и забытое определение может быть обнаружено совсем не сразу.
К>Здравствуйте, watchmaker, Вы писали:
К>>>Но синтаксически... сломали совместимость.
W>>Сломали совместимость с чем? Такое поведение у inline в стандарте языка было всегда
К>http://ideone.com/x4thLo — C89 — ok
И почему ты решил, что по ссылке с89? Там как раз тот самый «язык Си с лямбда-функциями и компанией».
В c89 это невалидный код. По стандарту он даже не скомпилируется.
Вот что думает gcc-4.8 -std=c89 про строчку c inline:
ll.c:3:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
inline void foo() { printf("foo\n"); }
^
А вот что думает clang-3.5 -std=c89:
ll.c:3:1: error: unknown type name 'inline'
inline void foo() { printf("foo\n"); }
^
Это уже не говоря о том, что есть и куда более важное несоответствие с c89:
gcc
ll.c:8:5: error: expected expression before ‘/’ token
// your code goes here
^
clang
ll.c:8:5: error: // comments are not allowed in this language
// your code goes here
^
К>Хочешь сказать, что инстанцирование &foo — это добрая воля и личная инициатива компилятора?
В с99 инстанциирования не будет по стандарту (и у компиляторов с этим нет проблем — не делать как-то всегда проще чем наоборот что-то делать).
В с89 такой код невалиден.
К>(Аналогичная ситуация со статическими членами-константами в С++ однозначно приводит к ошибке линковки).
Однозначно — слишком сильно сказано. Никто не гарантирует, что такая ситуация не приведёт. И, конечно, это нужно исправлять. Но достаточно часто не приводит из-за слишком умного оптимизатора, и забытое определение может быть обнаружено совсем не сразу.