Форум » C/C++ » Баги компиляторов относительно спецификатора inline. » Ответить

Баги компиляторов относительно спецификатора inline.

Сыроежка: Компиляторы довольно вольно обращаются со спецификатором inline. Например, они не обязаны встраивать код функции в месте ее вызова несмотря на то, что вы объявили функцию со спецификатором inline. С другой стороны, компилятор сам без вашего ведома может встроить код функции в месте ее вызова, хотя вы не объявляли функцию со спецификатором inline. Наверное, именно с этим связано наличие багов в известных компиляторах, имеющих отношение к спецификатору inline. Например, согласно стандарту C++ 20 (9.1.6 The inline specifier [dcl.inline]) [quote]6. ... If a definition of a function or variable is reachable at the point of its first declaration as inline, the program is ill-formed. [/quote] Теперь рассмотрим следующую простую программу. [pre2] #include <iostream> void f() { std::cout << "Hello inline specifier!\n"; } inline void f(); int main() { f(); return 0; }[/pre2] Компиляторы gcc HEAD 10.0.1 20200 и Visual C++ 2019 успешно компилируют программу, и программа выводит на консоль сообщение [pre2] Hello inline specifier![/pre2] И лишь компилятор clang HEAD 11.0.0 выдает сообщение об ошибки во время компиляции [pre2] prog.cc:8:13: error: inline declaration of 'f' follows non-inline definition inline void f(); ^ prog.cc:3:6: note: previous definition is here void f() ^ 1 error generated.[/pre2] Теперь обратимся к другому параграфу данной секции стандарта C++. [quote]5. ... If the inline specifier is used in a friend function declaration, that declaration shall be a definition or the function shall have previously been declared inline. [/quote] Попробуем скомпилировать следующую программу перечисленными компиляторами. [pre2] #include <iostream> void h(); class A { inline friend void h(); }; void h() { std::cout << "Hello inline specifier of ftiend!\n"; } int main() { h(); return 0; }[/pre2] И ... программа успешно компилируется всеми тремя компиляторами! Вывод программы на консоль [pre2] Hello inline specifier of ftiend![/pre2]

Ответов - 0



полная версия страницы