boost.config在包含<limits.h>
之后检查内容 - 如果定义了ULLONG_MAX
或ULONG_LONG_MAX
或ULONGLONG_MAX
(它还会执行每个编译器检查,如果{{1} })。
但是,如果我将_MSC_VER >= 1400
传递给gcc,即使定义了这些内容,我也无法真正使用-std=c++98 -pedantic-errors
。我可以检查long long
是否等于或大于__cplusplus
,但这与编译器标志无关 - 我可以使它等于1997并且仍能使用201103
- 取决于我给出的标志。
那么有没有办法真正检测我是否可以使用long long
?
答案 0 :(得分:3)
我会继续检查__cplusplus > 201103
,并告诉别人他们需要使用std=c++11
或它们的等价物,如果他们想要使用{{1}的图书馆}。这是一种直接而简单的方法。
答案 1 :(得分:0)
在预处理器检查提升后,我最终抑制了警告,因此-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