Как объясняет Крис, #defines - это текстовый механизм замещения. Расширение традиционно выполнялось как этап предварительной компиляции, при этом основной компилятор языка C ++ не имел (или не хотел) доступа к тексту перед заменой. По этой причине #defines может делать то, что невозможно с языковыми ограничениями C ++, например, объединять значения для формирования новых идентификаторов. В наши дни компиляторы, как правило, встраивают функциональность обработки макросов и могут включать некоторую информацию о символах препроцессора в таблицы символов отладки, скомпилированные в исполняемые файлы. Не очень желательно или практически невозможно получить доступ к этой отладочной информации для некоторых клиентов, так как форматы отладки и содержимое могут меняться в зависимости от версии компилятора, не очень переносимы, могут быть плохо отлажены: - /, и доступ к ним может быть медленным и неуклюжий.
Если я правильно вас понимаю, вам будет интересно, будет ли #defines из какой-либо библиотеки более низкого уровня, которую использует ваша библиотека, автоматически быть доступным программисту "приложения", использующему вашу библиотеку. Нет, они не будут. Вам нужно либо предоставить свои собственные определения для тех значений, которые API вашей библиотеки предоставляет прикладному программисту (внутреннее сопоставление со значениями библиотеки более низкого уровня, если они различаются), либо также отправить заголовок библиотеки более низкого уровня.
Для примера переназначения:
Ваша библиотека.h:
#ifndef INCLUDED_MY_LIBRARY_H
#define INCLUDED_MY_LIBRARY_H
enum Time_Out
{
Sensible,
None
};
void do_stuff(Time_Out time_out);
#endif
Ваша библиотека.c:
#include "my_library.h"
#include "lower_level_library.h"
void do_stuff(Time_Out time_out)
{
Lower_Level_Lib::do_stuff(time_out == Sensible ? Lower_Level_Lib::Short_Timeout,
: Lower_Level_Lib::No_Timeout);
LOWER_LEVEL_LIB_MACRO("whatever");
}
Как показано, использование Lower_Level_Lib не было раскрыто в my_library.h, поэтому программисту приложения не нужно знать или включать в него lower_level_library.h. Если вы обнаружите, что вам нужно / вы хотите поместить файл lower_level_library.h в my_library.h, чтобы использовать в нем его типы, константы, переменные или функции, то вам также потребуется предоставить программисту приложения этот заголовок библиотеки.