C++ 在VisualStudio2008中使用“static_if”之类的sulution设置编译时警告?

C++ 在VisualStudio2008中使用“static_if”之类的sulution设置编译时警告?,c++,visual-studio-2008,macros,compilation,compile-time,C++,Visual Studio 2008,Macros,Compilation,Compile Time,我有一个很大的宏,它包含大量的代码字符串。E从一种类型转换到另一种类型。当对结构声明中的初始类型进行一些更改时,可能会由较大的类型转换为较小的类型。然后编译器开始警告: 警告C4309:“参数”:常量值截断 在我的代码中指向宏的行号,不告诉真正的字符串和参数名。 我想写一个静态编译器时间破解,其中msg将是铸造字段名: #if defined(__GNUC__) # define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg)))

我有一个很大的宏,它包含大量的代码字符串。E从一种类型转换到另一种类型。当对结构声明中的初始类型进行一些更改时,可能会由较大的类型转换为较小的类型。然后编译器开始警告:

警告C4309:“参数”:常量值截断

在我的代码中指向宏的行号,不告诉真正的字符串和参数名。 我想写一个静态编译器时间破解,其中msg将是铸造字段名:

#if defined(__GNUC__)
#   define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg)))
#elif defined(_MSC_VER)
#   define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo
#else
#   error This compiler is not supported
#endif

#define STATIC_WARNING(name, expr, msg)         \
    {                                           \
        struct expr##__ {                       \
        DEPRECATE(void name##(), msg) {}        \
        expr##__() { name##(); }                \
     }; }
但首先,我需要一些类似于静态的东西。我的意思是我应该比较初始类型和最终类型,如果它们不相等,我将使用上面提到的静态警告。是否可以在MS Visual Studio 2008中编写类似的内容。顺便说一下,它不支持C++0x中的任何内容。所以我甚至不能使用BOOST\u STATIC\u ASSERT\u MSG,尽管它需要C++0x来启用消息。

事实上建议我使用模板专门化:

#if defined(__GNUC__)
#   define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg)))
#elif defined(_MSC_VER)
#   define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo
#else
#   error This compiler is not supported
#endif

template<typename T, bool> struct UseDeprecated { UseDeprecated() { T()._(); } };
template<typename T> struct UseDeprecated<T, true> { };

#define STATIC_WARNING(condition, expr, msg)    \
     {  struct expr##__ {                       \
        DEPRECATE(void _(), msg) {}             \
     }; UseDeprecated<expr##__, condition>(); }

这不完全是一个解决方案,但请检查,即,实际上我需要一个警告,但不是编译器的错误消息。不管怎样,谢谢。你试过BOOST\u STATIC\u WARNING吗?@Marc,不知怎么的BOOST\u STATIC\u WARNING False在我的机器上不会产生任何警告。我发现了同样的问题。此外,如果只在类型不相等时发出警告,如何实现静态_?