статическая константа по сравнению с #define

При выполнении знатока с переключателем "-x" он распечатает много диагностики, я предполагаю, что соответствующий путь зависимости может быть взят оттуда.

199
задан Damjan Pavlica 28 October 2018 в 22:38
поделиться

5 ответов

Лично я ненавижу препроцессор, поэтому я всегда буду использовать const.

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

Преимущества «const» заключаются в том, что их можно ограничивать, и их можно использовать в ситуациях, когда указатель объекту необходимо передать.

Я не знаю точно, что вы имеете в виду со «статической» частью. Если вы объявляете глобально, я бы поместил его в автономное пространство имен вместо использования static. Например,

namespace {
   unsigned const seconds_per_minute = 60;
};

int main (int argc; char *argv[]) {
...
}
133
ответ дан 23 November 2019 в 05:09
поделиться
  • Статическая константа является типизированной (у нее есть тип) и может быть проверена компилятором на предмет допустимости, переопределения и т. Д.
  • #define может быть переопределен как угодно. вам следует предпочесть статические константы. У него нет недостатков. Prprocessor следует использовать в основном для условной компиляции (а иногда, возможно, и для действительно грязных трюков).

4
ответ дан 23 November 2019 в 05:09
поделиться

Если это вопрос C ++, и в нем упоминается #define как В качестве альтернативы, тогда речь идет о «глобальных» (т.е. файловых) константах, а не о членах класса. Когда дело доходит до таких констант в C ++ , static const излишне. В C ++ const по умолчанию имеют внутреннюю компоновку, и нет смысла объявлять их статическими . Так что это действительно о const и #define .

И, наконец, в C ++ const предпочтительнее. Хотя бы потому, что такие константы типизированы и имеют область видимости. Просто нет причин предпочитать #define перед const , за некоторыми исключениями.

Строковые константы, кстати, являются одним из примеров такого исключения. С помощью строковых констант #define d можно использовать функцию конкатенации компиляторов C / C ++ во время компиляции, как в

#define OUT_NAME "output"
#define LOG_EXT ".log"
#define TEXT_EXT ".txt"

const char *const log_file_name = OUT_NAME LOG_EXT;
const char *const text_file_name = OUT_NAME TEXT_EXT;

PS Опять же, на всякий случай, когда кто-то упоминает static const как альтернатива #define , обычно это означает, что они говорят о C, а не о C ++. Интересно, правильно ли помечен этот вопрос ...

45
ответ дан 23 November 2019 в 05:09
поделиться

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

Возможно, вы захотите взглянуть на C ++ FAQ Lite для этого вопроса : http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7

5
ответ дан 23 November 2019 в 05:09
поделиться

См. Здесь: static const vs define

обычно используется объявление const (обратите внимание, что оно не обязательно должно быть static)

2
ответ дан 23 November 2019 в 05:09
поделиться