C++ #elif 指令被丢弃
Posted
技术标签:
【中文标题】C++ #elif 指令被丢弃【英文标题】:C++ #elif directive is being discarded 【发布时间】: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 是的,我同意,但它基本上不起作用
【参考方案1】:
预处理器传递发生在语义分析之前,枚举是一种语义构造。您需要使用模板来实现这一点,或者制作定义预处理器常量的L
和U
宏。
【讨论】:
以上是关于C++ #elif 指令被丢弃的主要内容,如果未能解决你的问题,请参考以下文章
C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif