Может ли макрос вернуть объект?
#define macro1 {obj1}
Поскольку макрос - это подстановка текста, могу ли я использовать такой макрос, как macro1.function1 ()?
Спасибо.
Может ли макрос вернуть объект?
#define macro1 {obj1}
Поскольку макрос - это подстановка текста, могу ли я использовать такой макрос, как macro1.function1 ()?
Спасибо.
Макрос никогда ничего не возвращает. Макрос возвращает текстовое представление кода, которое будет вставлено в то место программы, где он используется перед компиляцией.
Прочтите о препроцессоре C.
So:
#define macro1 {obj1}
int main() {
macro1
}
... будет скомпилирован так, как если бы вы написали
int main() {
{obj1}
}
Это просто текстовая подстановка, которая может дополнительно принимать параметр.
Если вы используете GCC, вы можете посмотреть, как программа будет выглядеть после предварительной обработки, с помощью инструмента cpp
:
# cpp myprog.cpp myprog.cpp_out
Обычно смешивание макросов с объектами - плохая практика, вместо этого используйте шаблоны.
Одно из известных применений макросов с точки зрения объектов - их использование для доступа к синглетонам (однако в целом это не такая уж хорошая идея):
#define LOGGER Logger::getLogger()
...
LOGGER->log("blah");
Вы также можете использовать препроцессор, чтобы выбрать во время компиляции объект, который вы хотите использовать:
#ifdef DEBUG
# define LOGGER DebugLogger
#else
# define LOGGER Logger
#end
// assuming that DebugLogger and Logger are objects not types
LOGGER.log("blah");
... но вышеупомянутые шаблоны делают это лучше.
obj
находится в {}
фигурных скобках.
- person Kornel Kisielewicz; 30.08.2010
cpp
- очень полезно для препроцессорной отладки.
- person namuol; 21.08.2013
Макрос запускает текстовую замену на этапе предварительной обработки (часть семи фаз компиляции). Возврат значения происходит во время выполнения. Вопрос не имеет смысла.
Макрос вашего примера заменяет текст macro1
на {obj1}
. Он только заменяет текст другим текстом; он не знает концепции объектов или классов.
Вы всегда можете увидеть, что делает компилятор, когда вы определяете макрос (и вызываете его). Код макроса просто заменяется (как и копипаст). Компилируйте с помощью gcc -E. Например для этого кода
#define macro1 {obj1}
int main() {
int obj1;
macro1
}
При компиляции с помощью gcc -E example.c я получаю следующий вывод
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "macro.c"
int main() {
int obj1;
{obj1} //here your call gets expanded
}
Функциональный макрос - это не настоящие функции в смысле функции C ++: это просто инструкции предварительной обработки.
Ваш исходный файл сначала считывается препроцессором, макрос обрабатывается (расширяется, заменяется и т. Д.), А затем полученный исходный код передается компилятору.
Таким образом, макрос - это не что иное, как «копирование и вставка» текста в исходном файле. Таким образом, вы можете использовать макрос, содержащий оператор return
, но он будет просто заменен в вашем коде.
См. Также Макросы, похожие на функции