2013-05-13 113 views
0

我想基于边界C++ #elif指令被丢弃

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 

}; 

所以创建一个类型声明,因为你在这里看到的取决于LU的类型将被定义的值。 例如

IntDecl< BOUND < 0, 65535 > >::Type i; // this should be a unsigned int 
IntDecl< BOUND < 0, 255 > >::Type i1; // this should be a char 

的问题是,无论是(ii1)被认为chars,在#elif被丢弃换句话说。任何帮助?为什么#elif没有执行?

+3

你误会了。预处理器在编译器之前运行,只是进行文本替换。 – chris 2013-05-13 23:45:29

+0

最好不要使用以下划线开头的名称;它们基本上被保留用于'执行'。如果U大于65535(如果使用C预处理器的构造完全可以工作),则最终会出现问题。你应该有一个'#else'子句,以便覆盖其他情况(并且它可能包含一个'#error'指令,以防止代码编译的信息比根本没有定义'Type'的信息更好) 。 – 2013-05-14 00:10:14

+0

@JonathanLeffler是的,我同意,但基本不工作 – 2013-05-14 01:49:54

回答

2

预处理程序传递发生在语义分析之前,枚举是一个语义结构。您需要使用模板来实现此操作,或者使用定义预处理器常量的宏和LU宏。