c++ - 如何用宏做static_assert?

标签 c++ macros g++ static-assert c++98

我试过使用this suggestion执行静态断言,但如果我在模板的方法中使用它,则不会出现编译错误。

例子如下:

#include <iostream>

#define STATIC_ASSERT(expr, msg)               \
{                                              \
    char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
    (void)STATIC_ASSERTION__##msg[0];          \
}

template <typename T >
class A
{
public:
  int foo(const int k )
  {
    // does not work
    STATIC_ASSERT( k > 9, error_msg );
    return k+5;
  }
};

int bar(const int k )
{
  // works fine
  //STATIC_ASSERT( k > 9, error_msg );
  return k+5;
}

int main()
{
  A<int> a;
  const int v = 2;

  std::cout<<a.foo(v)<<std::endl;
  std::cout<<bar(v)<<std::endl;

  // works fine
  //STATIC_ASSERT( v > 9, error_msg );
}

我用 g++ 4.7.2 编译了它,并警告说 C++ ISO 不支持 VLA:

g++ -Wall -g  -std=c++98 -Wextra -pedantic gvh.cpp

那么,为什么在模板方法中使用 STATIC_ASSERT 时编译不会失败?有没有办法让它失败?

注意:我需要一个 c++98(甚至可能是 c++03)的解决方案,如果可能的话只使用宏。

最佳答案

在 C++11 之前,我通常会这样做:

typedef int static_assert_something[something ? 1 : -1];

你也可以看看boost static assert .但它对我来说太臃肿了。把事情做大很容易,把事情做得更好很难。

关于c++ - 如何用宏做static_assert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14621968/

相关文章:

指向数组和 for 循环的 C++ 指针;

c++ - 访问图像像素; MatIterator_<> 和 Mat::at 运算符的比较

c# - 在 C# 中查找包含宏的文档

c++ - 对于 C++ sort(),如何将参数传递给自定义比较函数?

c++ - HAL 中的硬件特定库

c++ - 查找未执行的 C++ 代码行

c - isalnum 等效于使用#define

c++ - 获取没有对象的类的vtable

c++ - 编译器将 string& 转换为 basic_string<>&

c++ - gcc -fPIC 与 -shared