При выполнении знатока с переключателем "-x" он распечатает много диагностики, я предполагаю, что соответствующий путь зависимости может быть взят оттуда.
Лично я ненавижу препроцессор, поэтому я всегда буду использовать const.
Основное преимущество #define в том, что он не требует памяти для хранения в вашей программе, так как он на самом деле просто заменяет некоторый текст буквальным значением. Он также имеет то преимущество, что у него нет типа, поэтому его можно использовать для любого целочисленного значения без генерации предупреждений.
Преимущества «const» заключаются в том, что их можно ограничивать, и их можно использовать в ситуациях, когда указатель объекту необходимо передать.
Я не знаю точно, что вы имеете в виду со «статической» частью. Если вы объявляете глобально, я бы поместил его в автономное пространство имен вместо использования static. Например,
namespace {
unsigned const seconds_per_minute = 60;
};
int main (int argc; char *argv[]) {
...
}
Если это вопрос 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 ++. Интересно, правильно ли помечен этот вопрос ...
Использование статической константы похоже на использование любых других константных переменных в вашем коде. Это означает, что вы можете отслеживать, откуда поступает информация, в отличие от #define, который будет просто заменен в коде в процессе предварительной компиляции.
Возможно, вы захотите взглянуть на C ++ FAQ Lite для этого вопроса : http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7
См. Здесь: static const vs define
обычно используется объявление const (обратите внимание, что оно не обязательно должно быть static)