独立的GCC和内置功能

Bar*_*uch 4 gcc built-in freestanding

海湾合作委员会的文件http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html说(下-ffreestanding)独立环境意味着-fno-builtin.我可能误解了一个独立环境是什么或它是如何工作的,但在我看来,由于内置函数通常发出内联代码而不是调用库函数,这对于标准库可能缺失的独立环境来说是理想的.功能甚至完全缺失.

那么为什么我们不想在独立环境中使用biltins呢?

Kon*_*rov 15

在独立模式下,编译器不能依赖于语义考虑.

GCC中的大多数内置工作都是静默工作的 - 例如编译器看到你正在使用它strcpy()并且在托管模式下它可能会猜测,当你使用时strcpy(),你打算完全复制一个字符串.然后它可以替换strcpy为扩展等效的内置,这对于给定目标复制字符串更好.

在独立模式下,使用strcpy()函数意味着任何东西.这个想法不是联系中标准库的缺失.独立模式的想法是,即使在定义级别上也没有标准库,除了float.h,iso646.h,limits.h,stdarg.h,stdbool.h,stddef.h,stdint.h(C99标准4.6) .您可以在独立模式下决定使用硬盘驱动器进行格式化strcpy,这对于C语言来说是完全合法的.因此,编译器不知道如何使用内置函数,并且它完全拒绝使用它们.

  • 然而,你可以在独立模式中明确地做类似的事情; #define memcpy(x,y,z)__ builtin_memcpy((x),(y),(z))如gcc手册中所述. (2认同)
  • 此外,您可以在所有情况下直接使用__builtin_xxx,但它不是标准C,它是GNU扩展.静默GCC内置的主要利润是标准上下文替换,保持代码可移植性.如果您不关心合规性,也不关心事实,您的目标可能不支持此内置,那么显式内置使用或宏下使用是不错的选择. (2认同)