Макрос никогда ничего не возвращает.Макрос возвращает текстовое представление кода, который будет вставлен в место программы, где он использовался до компиляции.
Прочтите о C Препроцессоре .
Итак:
#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");
... но вышеупомянутые шаблоны делают это лучше.