& ldquo; static const & rdquo; vs & ldquo; # define & rdquo; vs & ldquo; enum & rdquo;

Отвечая на мою вторую часть вопроса для других.

Я искал функции рисования в QTreeView и нашел следующее:

void QTreeView::drawBranches ( QPainter * painter, const QRect & rect, const QModelIndex & index ) 

С помощью этой функции вы можете рисовать все, что хотите в левой части каждого элемента.

И еще один хороший выбор для этого - используйте Таблицы стилей для QTreeView:

http://qt.nokia.com/doc /4.6/stylesheet-examples.html#customizing-qtreeview

537
задан huysentruitw 1 January 2016 в 17:55
поделиться

7 ответов

Вообще говоря:

static const

Потому что он уважает объем и безопасен для типов.

Единственное предостережение, которое я мог видеть: если вы хотите, чтобы переменная была определена в командной строке. Есть еще альтернатива:

#ifdef VAR // Very bad name, not long enough, too general, etc..
  static int const var = VAR;
#else
  static int const var = 5; // default value
#endif

По возможности вместо макросов / многоточия используйте безопасную альтернативу типа.

Если вам действительно НУЖНО идти с макросом (например, вы хотите __FILE__ или __LINE__), то вам лучше ОЧЕНЬ назвать свой макрос ОЧЕНЬ осторожно: в соглашении об именах Boost рекомендует все заглавные буквы, начиная с имени проекта (здесь BOOST_), при просмотре библиотеки вы заметите, что за ней (в общем случае) следует имя конкретной области (библиотеки), а затем со значимым имя.

Это обычно делает для длинных имен:)

269
ответ дан Peter Mortensen 1 January 2016 в 17:55
поделиться

В C #define гораздо популярнее. Вы можете использовать эти значения для объявления размеров массивов, например:

#define MAXLEN 5

void foo(void) {
   int bar[MAXLEN];
}

ANSI C не позволяет вам использовать static const в этом контексте, насколько я знаю. В C ++ вы должны избегать макросов в этих случаях. Вы можете написать

const int maxlen = 5;

void foo() {
   int bar[maxlen];
}

и даже пропустить static, поскольку внутренняя связь уже подразумевается const [только в C ++].

17
ответ дан sellibitze 1 January 2016 в 17:55
поделиться

Если вы можете сойти с рук, static const имеет много преимуществ. Он подчиняется принципам обычной области видимости, отображается в отладчике и в целом подчиняется правилам, которым подчиняются переменные.

Тем не менее, по крайней мере, в оригинальном стандарте C, на самом деле он не является константой. Если вы используете #define var 5, вы можете написать int foo[var]; в качестве объявления, но вы не можете сделать это (кроме как в качестве расширения компилятора) с помощью static const int var = 5;. Это не так в C ++, где версия static const может использоваться везде, где может использоваться версия #define, и я полагаю, что это также относится и к C99.

Однако никогда не называйте константу #define строчными буквами. Она переопределит любое возможное использование этого имя до конца модуля перевода. Макросконстанты должны находиться в том, что фактически является их собственным пространством имен, которое традиционно состоит из заглавных букв, возможно, с префиксом.

9
ответ дан David Thornley 1 January 2016 в 17:55
поделиться

Не думаю, что есть ответ на вопрос «что всегда лучше», но, как сказал Матье

static const

безопасен по типу. Однако больше всего меня беспокоит #define , когда при отладке в Visual Studio вы не можете наблюдать за переменной. Выдает ошибку о том, что символ не может быть найден.

3
ответ дан 22 November 2019 в 22:18
поделиться

Разница между static const и #define заключается в том, что первый использует память, а второй не использует память для хранения. Во-вторых, вы не можете передать адрес #define , тогда как вы можете передать адрес статической константы . На самом деле это зависит от того, в каких обстоятельствах мы находимся, и нам нужно выбрать одно из этих двух. Оба лучше всего проявляют себя в разных обстоятельствах. Пожалуйста, не думайте, что один лучше другого ...: -)

Если бы это было так, Деннис Ричи оставил бы самого лучшего в одиночестве ... хахаха .. .: -)

32
ответ дан 22 November 2019 в 22:18
поделиться

Конкретно в C? В языке C правильный ответ: используйте #define (или, если необходимо, enum )

Хотя полезно иметь свойства области видимости и типизации константы const объект, на самом деле объекты const в C (в отличие от C ++) не являются настоящими константами и поэтому обычно бесполезны в большинстве практических случаев.

Итак, в C выбор должен определяться как вы планируете использовать свою константу. Например, вы не можете использовать объект const int в качестве метки case (хотя макрос будет работать). Вы не можете использовать объект const int в качестве ширины битового поля (хотя макрос будет работать). В C89 / 90 вы не можете использовать объект const для указания размера массива (в то время как макрос будет работать). Даже в C99 вы можете ' t используйте объект const , чтобы указать размер массива, когда вам нужен массив, отличный от VLA .

Если это важно для вас, то он определит ваш выбор. В большинстве случаев у вас не будет другого выбора, кроме как использовать #define в C. И не забывайте еще одну альтернативу, которая создает истинные константы в C - enum .

] В C ++ объекты const являются истинными константами, поэтому в C ++ почти всегда лучше отдавать предпочтение варианту const (хотя явные static в C ++ не нужны) .

106
ответ дан 22 November 2019 в 22:18
поделиться

Это зависит от того, для чего вам нужно значение. Вы (и все остальные) пропустили третью альтернативу:

  1. static const int var = 5;
  2. #define var 5
  3. enum {var = 5};

Игнорирование проблем, связанных с выбором имени , затем:

  • Если вам нужно передать указатель, вы должны использовать (1).
  • Поскольку (2), по-видимому, является вариантом, вам не нужно передавать указатели.
  • Оба (1 ) и (3) имеют символ в таблице символов отладчика, что упрощает отладку. Более вероятно, что (2) не будет иметь символа, поэтому вы задаетесь вопросом, что это такое.
  • (1) не может использоваться в качестве измерения для массивов в глобальной области видимости; и (2), и (3) могут.
  • (1) не может использоваться в качестве измерения для статических массивов в области видимости функции; и (2), и (3) могут.
  • В C99 все они могут использоваться для локальных массивов. Технически, использование (1) будет подразумевать использование VLA (массива переменной длины), хотя размерность, на которую ссылается 'var', конечно же, будет иметь размер 5.
  • (1) не может использоваться в таких местах, как операторы switch; оба (2) и (3) могут.
  • (1) не может использоваться для инициализации статических переменных; и (2), и (3) могут.
  • (2) может изменить код, который вы не хотели изменять, потому что он используется препроцессором; и (1), и (3) не будут иметь таких неожиданных побочных эффектов.
  • Вы можете определить, установлено ли (2) в препроцессоре; ни (1), ни (3) не допускают этого.

Таким образом, в большинстве контекстов предпочтительнее «перечисление» перед альтернативами. В противном случае первый и последний пункты, вероятно, будут определяющими факторами - и вам придется больше подумать, если вам нужно удовлетворить оба сразу.

Если вы спрашивали о C ++, то вы ' d используйте параметр (1) - статическую константу - каждый раз.

660
ответ дан 22 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: