宏通常用于文本替换。在我的情况下,我需要有条不紊地删除一些关键字,以便在没有特定功能的编译器中进行编译。
具体来说,我一直在调查cpp11 range此代码段来自哪个
template <typename C>
struct has_size {
template <typename T>
static constexpr auto check(T*) -> // problem in VS2013
typename std::is_integral<
decltype(std::declval<T const>().size())>::type;
// .. some more stuff
};
我提供这个作为产生问题的例子。在上面的代码中我最终做了
template <typename T>
static
#if COMPILE_WITH_GCC_NEW_ENOUGH
constexpr
#endif
auto check(T*) ->
因为还有其他部分constexpr
需要用const
替换才能编译。
我要问的是一种说法,例如
#define Constexpr ?????????
这样它就会被gcc编译中的constexpr
替换,而VS编译中的文本上没有。
答案 0 :(得分:2)
当然,简单地说:
#define constexpr
会将constexpr
扩展为空。对于不支持此功能的编译器,您可以将此宏定义包装在适当的#if
内。
有时候人们会使“空”扩展变得更加明确:
#define constexpr /* nothing */