Skip to content

GNU 对 ISO C 的扩展

字数: 0 字 阅读时间: 0 分钟

C Extensions (Using the GNU Compiler Collection (GCC))

GNU 的 GCC 编译器对 ISO C 语言做了很多扩展,这使得 C 语言能完成更多复杂的功能。比如半精度浮点数、嵌套函数定义、128 位超大整数等等标准 C 里没有的功能,非常 NB。这里只说一些我见过或者用过的一些语法。

GNU 扩展支持 GCC, Clang/LLVM 编译器,Visual Studio 默认的 MSVC 并不支持。如果你的 C 代码需要在 MSVC, GCC, Clang 等多个编译器下编译,那么需要做好兼容性处理。

怎么做兼容性处理呢?当然就是按照不同的编译器去编译不同的代码。那么怎么判断编译器呢?答案是条件编译。

在标准 C 中,会定义 __STDC____STDC_VERSION__ 宏,我们可以通过这两个宏判断 C 标准:

标准
C89/90__STDC__
C99__STDC_VERSION__ = 199901L
C11__STDC_VERSION__ = 201112L

同样的,不同的编译器会自己定义一些特有的宏,比如 GCC 的 __GNUC__ ,clang 的 __clang__ 等等。下面的代码可以简单判断当前的编译器,通过这种方式可以避免一些编译问题:

C
#include <stdio.h>

int main(void) {
#if defined(__GNUC__)
    printf("GCC Compiler\n");
#endif   /* __GNUC__ */

#if defined(_MSC_VER)
    printf("MSVC Compiler\n");
#endif   /* _MSC_VER */

#if defined(__clang__)
    printf("Clang Compiler\n");
#endif   /* __clang__ */
}

Powered by VitePress, deployed by Github & Vercel.