2013-05-13 2 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 

}; 

Итак, как вы видите здесь в зависимости от значения 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 не работает?

+3

Вы недоразумение. Препроцессор работает перед компилятором и просто заменяет текст. – chris

+0

Лучше не использовать имена, начинающиеся с подчеркивания; они в основном зарезервированы для использования «реализацией». Вы также столкнетесь с проблемой, если U больше 65535 (если конструкция, использующая препроцессор C, будет работать вообще). У вас должно быть предложение '# else', чтобы вы освещали другие случаи (и оно могло содержать директиву' # error', чтобы предотвратить компиляцию кода с лучшим сообщением, чем вы могли бы получить от того, что не определяете 'Type' вообще) , –

+0

@JonathanLeffler да, я согласен, но его не работает в основном –

ответ

2

Передача препроцессора происходит до семантического анализа, а перечисление - это семантическая конструкция. Вам нужно использовать шаблоны для реализации этого или сделать макросы L и U, которые определяют препроцессорные константы.

 Смежные вопросы

  • Нет связанных вопросов^_^