检测编译时是否存在长长

detect if long long is present at compile time

本文关键字:存在 是否 编译 检测      更新时间:2023-10-16

boost.config 在包含<limits.h>后检查内容 - 如果定义了ULLONG_MAXULONG_LONG_MAXULONGLONG_MAX(它也执行每个编译器检查,如 if _MSC_VER >= 1400 )。

但是如果我-std=c++98 -pedantic-errors传递给 gcc,即使定义了这些东西,我也无法真正使用long long。我可以检查__cplusplus它是否等于或大于201103但这与编译器标志无关 - 我可以让它等于 1997 并且仍然可以使用 long long - 取决于我给出的标志。

那么有没有办法真正检测我是否可以使用long long

我会按照

检查__cplusplus > 201103的思路进行操作,只是告诉人们他们需要使用std=c++11,或者如果他们想将您的库与long long一起使用,这是等效的。这是直接而简单的方法。

在预处理器检查 boost 后,我最终抑制了警告,因此-pedantic-errors没有抱怨:

#include <climits>
#if defined(_MSC_EXTENSIONS) || (defined(_MSC_VER) && (_MSC_VER >= 1400))
#define MY_LIBRARY_HAS_DETECTED_LONG_LONG
#elif (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
#define MY_LIBRARY_HAS_DETECTED_LONG_LONG
#endif
#ifdef MY_LIBRARY_HAS_DETECTED_LONG_LONG
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wlong-long"
#endif
// my overloads using long long
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
#endif // MY_LIBRARY_HAS_DETECTED_LONG_LONG