2016-03-06 18 views
2

boost.config检查东西存在在编译时 - 如果ULLONG_MAXULONG_LONG_MAXULONGLONG_MAX被定义(它也确实每编译器检查一样,如果_MSC_VER >= 1400)。检测是否长长包括<code><limits.h></code>

但是,如果我通过-std=c++98 -pedantic-errors gcc我不能真正使用long long即使这些东西被定义。我可以检查__cplusplus是否等于或大于201103,但这与编译器标记无关 - 我可以使其等于1997年,仍然可以使用long long - 这取决于我给出的标记。

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

+0

这闻起来像一个XY问题。什么是你想解决的真正问题。不,不是你问的;您认为其解决方案的问题是“检测我是否可以使用很长时间”。 –

+0

@SamVarshavchik我正在写一个库,并且如果可能的话,想为''long long''提供一个函数的重载。这个想法是尽可能多地处理基本类型。 – onqtam

+0

我想象一个函数模板,可以采用任何整数类型,也许有一些SFINAE技巧。 –

回答

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 
3

我会沿着检查__cplusplus > 201103的方向走,只是告诉人们他们需要使用std=c++11,或者如果他们想用long long来使用您的图书馆,那么它就是等效的。这是直接简单的方法。

相关问题