【发布时间】:2013-12-06 14:10:40
【问题描述】:
我一直在尝试实现类似于 C++11 标准中定义的static_assert 的方法。主要问题是 C++ 编译器如何将传递给static_assert 的文本消息写成const char*?我可以让编译器写出像A_is_not_POD 这样的消息。这就是我所拥有的:
#define MY_STATIC_ASSERT(condition, name) \
typedef char name[(condition) ? 1 : -1];
但是让编译器编写类似"Error: A is not POD." 的东西会非常好,有什么建议吗?
【问题讨论】:
-
不,那是不可能的。使用旧标准唯一可以得到的就是吐出变量名。
-
“我可以让编译器写出像 A_is_not_POD 这样的消息”如何展示你已经为实现这一目标所做的工作?这会让你的问题更清楚。在重新修改之前,FAQ 曾经说过“最好的问题都包含一些源代码”。
-
真可惜。但是我们在哪里可以找到 static_assert 函数的源代码呢?有趣的是编译器如何将字符串写入编译器消息。我一直在尝试以某种方式使用模板,但到目前为止没有成功。
-
@Shubham C++11 的
static_assert不是一个函数——它是一个关键字,就像for。for也没有源代码。这就是为什么编译器可以对参数做任何它真正想做的事情。 -
我猜这是不可能的,因为 Boost 的静态断言无法在 C++03 中打印消息。据推测,他们非常努力地寻找方法。如果在 C++03 中是不可能的,那么在 C99 中几乎肯定是不可能的。
标签: c++ c++11 c99 static-assert