检测编译时是否存在long long

时间:2016-03-06 12:17:38

标签: c++ g++

boost.config在包含<limits.h>之后检查内容 - 如果定义了ULLONG_MAXULONG_LONG_MAXULONGLONG_MAX(它还会执行每个编译器检查,如果{{1} })。

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

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

2 个答案:

答案 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