C 如何知道是否定义了uuu uint128_ut

C 如何知道是否定义了uuu uint128_ut,c,c-preprocessor,128-bit,C,C Preprocessor,128 Bit,我们可以使用预处理器了解是否定义了unsigned long: #include <limits.h> #ifndef ULLONG_MAX typedef unsigned long t_mask; #else typedef unsigned long long t_mask; #endif #包括 #ifndef ULLONG_MAX typedef无符号长t_掩码; #否则 typedef无符号长t_掩码; #恩迪夫 但是如何知道是否定义了\uu uint128\u

我们可以使用预处理器了解是否定义了
unsigned long

#include <limits.h>

#ifndef ULLONG_MAX
typedef unsigned long t_mask; 
#else
typedef unsigned long long t_mask;
#endif
#包括
#ifndef ULLONG_MAX
typedef无符号长t_掩码;
#否则
typedef无符号长t_掩码;
#恩迪夫
但是如何知道是否定义了
\uu uint128\u t

因为,正确的做法可能是检查一些已知的好的GCC版本


有关用于检查GCC编译器版本的宏的信息。

我还没有讨论过uu uint128\t,但根据现有的模式使用情况,我预计会出现以下情况

#include <stdint.h>

#ifndef UINT128MAX
    #error "__uint128_t not defined"
#endif
#包括
#ifndef UINT128MAX
#错误“\uu uint128\u未定义”
#恩迪夫

希望这有帮助

您可以尝试以下方法。我不知道这有多可靠,但这可能是最简单的方法

#ifdef __SIZEOF_INT128__
    // do some fancy stuff here
#else
    // do some fallback stuff here
#endif

在/usr/libexec/gcc树中找到您的cc1,然后询问它:

$ strings /usr/libexec/gcc/x86_64-redhat-linux/4.6.3/cc1 | grep uint128_t __uint128_t (or not) $strings/usr/libexec/gcc/x86_64-redhat-linux/4.6.3/cc1 | grep uint128_t __uint128_t(或不)
Clang知道它支持GCC代码,所以我倾向于Sparky的解决方案GCC扩展是
\uuuuu int128
-
\uuuu int128\u t
/
\uuuuu uint128\u t
是后来被大多数其他编译器采用的intel ICC扩展。
unsigned\uuuu int128
仅在64位目标上受GCC支持,因此,版本检查是不够的,除非您知道您只针对x86-64、AArch64、MIPS64或任何东西进行编译。编译器(例如x86-64 gcc8.2)没有在stdint.h或limits.h中定义这一点。这是Linux内核的功能,请参阅include/Linux/math64.h。