2013-09-10 3 views
2

Документы GCC на http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html говорят (под -ffreestanding), что автономная среда подразумевает -fno-builtin. Возможно, я неправильно понимаю, что такое автономная среда или как она работает, но мне кажется, что, поскольку встроенные функции обычно генерируют встроенный код вместо вызова библиотечной функции, это идеально подходит для автономной среды, где стандартная библиотека может отсутствовать функциональности или даже вообще отсутствует.Свободностоящие GCC и встроенные функции

Итак, почему мы не хотим использовать biltins с автономной средой?

ответ

11

В автономном режиме компилятор не может полагаться на семантические соображения.

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

В автономном режиме, используя strcpy(), функция означает НИЧЕГО. Идея - это не стандартное отсутствие библиотеки в связях. Идея автономного режима состоит в том, что стандартная библиотека не существует даже на уровне определения, кроме float.h, iso646.h, limits.h, stdarg.h, stdbool.h, stddef.h, stdint.h (C99 standard 4.6) , Вы можете в автономном режиме решить форматировать свой жесткий диск с помощью strcpy, и это вполне легально для языка C. Таким образом, компилятор не знает, как использовать встроенные функции, и он отказывается использовать их вообще.

+0

Вы можете, однако, явно сделать что-то вроде; #define memcpy (x, y, z) __builtin_memcpy ((x), (y), (z)) – vyudh

+0

Вы можете, однако, в автономном режиме явно делать что-то вроде; #define memcpy (x, y, z) __builtin_memcpy ((x), (y), (z)) Как указано в руководстве gcc. – vyudh

+1

Кроме того, вы можете во всех случаях использовать __builtin_xxx напрямую, но он не является стандартным C, это расширение GNU. Основная прибыль бесшумных встроенных контроллеров GCC - это стандартная замена контекста, сохраняющая переносимость кода. Если вы не заботитесь о соответствии, а также не заботитесь о том, что ваша цель может не поддерживать этот встроенный, то явное использование встроенного приложения или использование под макросом является хорошим вариантом. –