boost.preprocessor 中定义的常量的名称
name of defined constants in boost.preprocessor
这个定义是修复的,我不能改变它们(第三方库)
#define X_ERR_OK (0)
#define X_ERR_FOO (816)
#define X_ERR_OTHER (842)
// .. and more
有一个小函数,它返回错误代码的名称(我的代码,我可以更改它)
#define X_ERR_CASE( e ) case e: return #e
const char* err_name( int err ) {
switch( err ) {
X_ERR_CASE( X_ERR_OK );
X_ERR_CASE( X_ERR_FOO );
X_ERR_CASE( X_ERR_OTHER );
}
return "<unknown>";
}
这行得通。现在我发现 boost.preprocessor 是一个智能库并尝试使用它:
#define XX_ERR_CASE( r, _, e ) case e: return BOOST_PP_STRINGIZE(e);
#define XX_ERRORS( seq )
const char* err_name2( int err ) {
switch( err ) {
BOOST_PP_SEQ_FOR_EACH( XX_ERR_CASE, _, seq )
}
return "<unknown>"; }
XX_ERRORS(
(X_ERR_OK)
(X_ERR_FOO)
(X_ERR_OTHER)
)
但这不起作用,因为输出不是定义的名称,而是数字。例如,我想拥有:X_ERR_FOO
,但我得到(816)
如果我XX_ERR_CASE
更改为
#define XX_ERR_CASE( r, _, e ) case e: return #e;
我得到BOOST_PP_SEQ_HEAD(((816)) ((842)) (nil))
我如何X_ERR_FOO
打电话给err_name(816)
?
我怀疑这是可以接受的,但无论如何我都会添加它,以防它有所帮助。使用这种方法,您需要更改调用XX_ERRORS
的方式,其参数需要删除其X_
前缀。
#include <iostream>
#include <boost/preprocessor.hpp>
#define X_ERR_OK (0)
#define X_ERR_FOO (816)
#define X_ERR_OTHER (842)
#define XX_ERR_CASE( r, _, e ) case BOOST_PP_CAT(X_,e): return "X_" BOOST_PP_STRINGIZE(e);
#define XX_ERRORS( seq )
const char* err_name2( int err ) {
switch( err ) {
BOOST_PP_SEQ_FOR_EACH( XX_ERR_CASE, _, seq )
}
return "<unknown>"; }
XX_ERRORS(
(ERR_OK)
(ERR_FOO)
(ERR_OTHER)
)
int main()
{
std::cout << err_name2(816) << std::endl;
}
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 在定义的函数中使用常量时出错
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- C++ 确保子类为常量提供自定义值
- 用矩阵将函数中的整数值替换定义的常量
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 将字符串文本常量定义为 char const* 和 wchar const*
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 调用构造函数与将内联常量定义为默认参数
- 是否允许在常量定义的对象上丢弃 const 只要它没有实际被修改?
- 多个文件中的常量定义
- 常量定义和模板
- 如何在另一个命名空间中使用常量定义的外部
- 全局常量定义的顺序
- 将常量定义为函数会导致标头=坏主意
- 是一个宏,其变量总是用变量或常量定义