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

;

因此,正如您在此处看到的,取决于 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 没有执行?

【问题讨论】:

你误会了。预处理器在编译器之前运行,只是进行文本替换。 最好不要使用以下划线开头的名称;它们主要保留给“实现”使用。如果 U 大于 65535(如果使用 C 预处理器的构造完全可以工作),您最终也会遇到问题。您应该有一个#else 子句,以便涵盖其他情况(并且它可能包含一个#error 指令,以防止代码编译时使用比您根本不定义Type 得到的更好的消息)。 @JonathanLeffler 是的,我同意,但它基本上不起作用 【参考方案1】:

预处理器传递发生在语义分析之前,枚举是一种语义构造。您需要使用模板来实现这一点,或者制作定义预处理器常量的LU 宏。

【讨论】:

以上是关于C++ #elif 指令被丢弃的主要内容,如果未能解决你的问题,请参考以下文章

C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif

Apache RewriteRule丢弃SetInputFilter DEFLATE配置指令

预编译指令

c++宏使用总结转

模块shell脚本逻辑结构

#import 指令 (C++)