Я пытаюсь создать объявление типа на основе границдиректива 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
не работает?
Вы недоразумение. Препроцессор работает перед компилятором и просто заменяет текст. – chris
Лучше не использовать имена, начинающиеся с подчеркивания; они в основном зарезервированы для использования «реализацией». Вы также столкнетесь с проблемой, если U больше 65535 (если конструкция, использующая препроцессор C, будет работать вообще). У вас должно быть предложение '# else', чтобы вы освещали другие случаи (и оно могло содержать директиву' # error', чтобы предотвратить компиляцию кода с лучшим сообщением, чем вы могли бы получить от того, что не определяете 'Type' вообще) , –
@JonathanLeffler да, я согласен, но его не работает в основном –