【发布时间】:2013-05-13 23:44:11
【问题描述】:
我正在尝试基于边界创建类型声明
template<class B>
struct IntDecl {
enum {
L = B::_l, U = B::_u
};
#if (L >=0 && U <=255)
typedef char Type;
#elif (L>=0&&U<=65535)
typedef unsigned int Type;
#endif
};
因此,正如您在此处看到的,取决于 L 和 U 的值,类型将被定义。
例如
IntDecl< BOUND < 0, 65535 > >::Type i; // this should be a unsigned int
IntDecl< BOUND < 0, 255 > >::Type i1; // this should be a char
问题是,(i 和i1)都被认为是chars,换句话说#elif 被丢弃了。有什么帮助吗?为什么#elif 没有执行?
【问题讨论】:
-
你误会了。预处理器在编译器之前运行,只是进行文本替换。
-
最好不要使用以下划线开头的名称;它们主要保留给“实现”使用。如果 U 大于 65535(如果使用 C 预处理器的构造完全可以工作),您最终也会遇到问题。您应该有一个
#else子句,以便涵盖其他情况(并且它可能包含一个#error指令,以防止代码编译时使用比您根本不定义Type得到的更好的消息)。 -
@JonathanLeffler 是的,我同意,但它基本上不起作用
标签: c++ templates c-preprocessor preprocessor-directive