http://www.queryhome.com/26340/define-vs-enum-vs-constant

це статьи здесь:http://www.learncpp.com/cpp-tutorial/45-enumerated-types/упоминается следующее:

Наконец, как и в случае с постоянными переменными, перечисляемые типы отображаются в отладчике,делая их более полезными, чем #defined значения в этом отношении.

Как достигается смелое предложение выше?

Благодарю.

 Matthieu M.10 сент. 2011 г., 16:32
возможный дубликат"static const" против "#define" в c
 Simplicity22 янв. 2011 г., 18:25
@Nawaz. Это совершенно нормально, не беспокойся об этом.
 Nawaz22 янв. 2011 г., 13:46
Я отредактировал заголовок и добавил один тег, надеюсь, вы не против. :-)

Ответы на вопрос(1)

Решение Вопроса

Рассмотрим этот код,

#define WIDTH 300

enum econst
{
   eWidth=300
};

const int Width=300;

struct sample{};

int main() 
{
        sample s;
        int x = eWidth * s; //error 1
        int y = WIDTH * s;  //error 2
        int z = Width * s;  //error 3
        return 0;
}

Очевидно, что каждое умножение приводит к ошибке компиляции,но посмотрите, как GCC генерирует сообщения для каждой ошибки умножения:

prog.cpp: 19: ошибка: нет совпадения для оператора * в 'ширине * с'
prog.cpp: 20: ошибка: нет совпадения для оператора * в течение 300 секунд
prog.cpp: 21: ошибка: нет совпадения для оператора * в ширине * с

В сообщении об ошибке вы не видите макросWIDTH который ты#defined, правильно? Это потому, что к тому времени, когда GCC делает какую-либо попытку компилировать строку, соответствует второй ошибке, он не видитWIDTH, всего он видит только 300, так как до того, как GCC компилирует строку, препроцессор имеетуже замененыWIDTH с 300. С другой стороны, ничего подобного не происходит сперечисление eWidth а такжеConst Width.

Смотрите сами ошибки здесь:http://www.ideone.com/naZ3P

Также читайтеItem 2 : Prefer consts, enums, and inlines to #defines изЭффективный C ++ Скотт Мейерс.

 Nawaz27 мар. 2012 г., 09:05
@MatthieuM .: Я не вижу другихлучше аргумент в пользу предпочтенияconst над#define, если этот аргумент слаб. Насколько хорош (и практичен) аргумент, можно сказать в свете всех других аргументов. Поведение компиляторов, наряду с языком, определяет, что следует использовать. Иначе, что еще решает?
 Nawaz27 мар. 2012 г., 06:56
{продолжение} ... Таким образом, такое рассуждение очень зависит от компилятора, и поэтому я думаю, что принятие сообщения об ошибке Clang в качестве краеугольного камня рассуждения также не будет лучше, потому что кто-то может прийти и сказать именно то, что вы сказали, заменив"Clang" с участием"GCC, MSVC", а также"лучше" с участием«Не так лучше»заканчивая его суть«Я думаю, что лучшее решение вопроса не будет использоватьлязгсообщения об ошибках как краеугольный камень рассуждений " , Надеюсь, вы поняли мою точку зрения. :-)
 Matthieu M.10 сент. 2011 г., 16:31
По общему признанию, Clang, вероятно, выдает лучшее сообщение об ошибке, показывая строку, которая вызвала ошибку, и, таким образом, включает макрос (вместе с его расширением). Хотя я согласен с тем, что макросы не следует использовать для констант, я думаю, что лучшая обработка вопроса не будет использовать сообщения об ошибках gcc в качестве краеугольного камня рассуждений.
 Nawaz27 мар. 2012 г., 06:52
@MatthieuM .: Clang может выдавать лучшее сообщение об ошибке, но те, кто использует GCC для компиляции своего кода, не собираются перекомпилировать свой код с Clang, чтобы увидеть лучшее сообщение об ошибке. {} Прод
 Matthieu M.27 мар. 2012 г., 08:58
Я понимаю, к чему вы стремитесь, но я не согласен. Я думаю, что использование сообщений об ошибках компилятора в качестве аргумента для перечислений, а не макросовслабыйв том смысле, что это зависит от того, как компилятор создает те сообщения об ошибках, которые изменяются от компилятора к компилятору и от версии к версии. Но тогда сам вопрос довольно странный, поскольку он основан на нынешнем поведении отладчиков ... поэтому мне все равно.

Ваш ответ на вопрос