Область применения #undef C++


У меня есть вопрос об использовании #undef переопределить макросы.
У меня есть файл global.h который содержит ряд макросов #define-d. В коде, использующем эти макросы, я обнаружил, что значения, которые содержат макросы, не являются достаточно общими. Я хочу переопределить макросы, чтобы сделать их более общими. Я написал следующий фрагмент кода, чтобы сделать это:

 std::cout << endl << "Enter pitch threshold:" << endl;  
 std::cin >> pitchT;  
 #ifdef PitchThreshold  
  #undef PitchThreshold  
  #define PitchThreshold pitchT   
  #endif  

Мои вопросы:
Обеспечивает ли использование #undef таким образом переопределение макроса во всех исходных файлах или это локально для функции, в которой написаны строки кода выше? Какова область действия операторов #undef и #define?
Что я могу сделать (кроме изменения макросов в файле, где они сами являются #define-d), чтобы гарантировать, что определения макросов будут изменены во всех исходных файлах?
Спасибо,
Sriram

3 ответа

Решение

#ifdef это директива препроцессора, это означает, что она будет применена до компиляции вашего исходного кода. Это означает, что будет затронут только исходный код "ниже". Если вы запустите исходный код через препроцессор, вы сможете увидеть результат. Это даст вам больше понимания работы препроцессора.

Область действия оператора #undef - это весь файл после его вызова. Это включает в себя все файлы, которые включают его (потому что препроцессор просто объединяет файлы в цепочку). Поскольку он является частью препроцессора, у него нет таких странных вещей, как область действия.

любоймакрос не является ни локальной, ни глобальной переменной, а выражением, подобным константе, поэтому, даже если какое-то DEFINED_VALUE будетined где-нибудь после этого - это un-определение будет ограничено от своего места до конца этого исходного файла.

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

Отвечая на последний вопрос:

Мы не можем с комфортом переопределить макросы — в смыслеобъем. Неудобный способ — разместить весь код в одном файле.

На практике можно сделать нечто вроде стандартного — объявление новой переменной (вверху страницы).function) с похожим именем, чтобы использовать его параллельно с определенным значением.

Другие вопросы по тегам