独立GCC和内置函数

6
GCC文档在http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html中提到(在-ffreestanding下)自由环境意味着-fno-builtin。我可能误解了自由环境的确切含义或工作原理,但似乎对于标准库可能缺少功能甚至完全缺少的自由环境来说,内置通常会发出内联代码而不是调用库函数,这是理想的选择。
那么为什么我们不想在自由环境中使用内置呢?
1个回答

20
在自由状态下,编译器无法依赖语义考虑。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)) - vyudh
2
你可以在自由状态下显式地执行以下操作:#define memcpy(x,y,z) __builtin_memcpy((x), (y), (z))如GCC手册所述。 - vyudh
2
此外,您可以在所有情况下直接使用 __builtin_xxx,但这不是标准C,而是GNU扩展。无声的GCC内置函数的主要优点是标准上下文替换,保持代码的可移植性。如果您不关心合规性,并且也不关心您的目标可能不支持此内置函数,则显式内置函数使用或在宏下使用是不错的选择。 - Konstantin Vladimirov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接