Информация об изменениях

Сообщение Re[8]: Феерия с inline в C99 и GCC 5.1 от 05.07.2015 10:43

Изменено 05.07.2015 10:48 watchmaker

Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, watchmaker, Вы писали:


К>>>Но синтаксически... сломали совместимость.

W>>Сломали совместимость с чем? Такое поведение у inline в стандарте языка было всегда

К>http://ideone.com/x4thLo — C89 — ok


И почему ты решил, что по ссылке с89?
Это невалидный код. По стандарту он даже не скомпилируется.
Вот что думает gcc-4.8 про строчку c inline:
ll.c:3:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
 inline void foo() { printf("foo\n"); }
        ^

А вот что думает clang-3.5:
ll.c:3:1: error: unknown type name 'inline'
inline void foo() { printf("foo\n"); }
^


Это уже не говоря о том, что есть и куда более важное несоответствие с c89:
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?
Это невалидный код. По стандарту он даже не скомпилируется.
Вот что думает 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 такой код невалиден.

К>(Аналогичная ситуация со статическими членами-константами в С++ однозначно приводит к ошибке линковки).

Однозначно — слишком сильно сказано. Никто не гарантирует, что такая ситуация не приведёт. И, конечно, это нужно исправлять. Но достаточно часто не приводит из-за слишком умного оптимизатора, и забытое определение может быть обнаружено совсем не сразу.