【问题标题】:C++ #elif directive is being discardedC++ #elif 指令被丢弃
【发布时间】: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 是的,我同意,但它基本上不起作用

标签: c++ templates c-preprocessor preprocessor-directive


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 2017-12-10
    • 2015-05-23
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2014-09-14
    相关资源
    最近更新 更多