用 C++ 宏替换文本

Nik*_*iou 0 c++ macros

宏通常用于文本替换。就我而言,我需要有条件地清除一些关键字,以便在没有特定功能的编译器中进行编译。

具体来说,我一直在研究这个片段来自的cpp11 范围

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
};
Run Code Online (Sandbox Code Playgroud)

我提供这个作为产生问题的例子。在上面的代码中,我最终做了

template <typename T>
static 
#if COMPILE_WITH_GCC_NEW_ENOUGH
    constexpr 
#endif
auto check(T*) -> 
Run Code Online (Sandbox Code Playgroud)

因为还有其他部分constexpr需要替换const才能编译。

我要问的是一种说法,例如

#define Constexpr ?????????
Run Code Online (Sandbox Code Playgroud)

这样它就会constexpr在 gcc 编译中被替换,而在 VS 编译中没有文本内容

Gre*_*ill 5

当然,简单地说:

#define constexpr
Run Code Online (Sandbox Code Playgroud)

将扩大constexpr到一无所有。您可以将此宏定义包装在适合#if您的不支持此功能的编译器中。

有时人们使“空”扩展更加明确:

#define constexpr /* nothing */
Run Code Online (Sandbox Code Playgroud)