Возвращаемое значение макроса

Может ли макрос вернуть объект?

#define macro1 {obj1}

Поскольку макрос - это подстановка текста, могу ли я использовать такой макрос, как macro1.function1 ()?

Спасибо.


person Steveng    schedule 30.08.2010    source источник
comment
Почему бы вам не рассказать нам о большей проблеме, которую вы пытаетесь решить, а не о шаге.   -  person GManNickG    schedule 30.08.2010
comment
@GManNickG Может, ему просто интересно узнать, что возможно ...   -  person j b    schedule 27.08.2014


Ответы (5)


Макрос никогда ничего не возвращает. Макрос возвращает текстовое представление кода, которое будет вставлено в то место программы, где он используется перед компиляцией.

Прочтите о препроцессоре 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");

... но вышеупомянутые шаблоны делают это лучше.

person Kornel Kisielewicz    schedule 30.08.2010
comment
Спасибо. Итак, могу ли я использовать macro1.function в приведенном выше примере? - person Steveng; 30.08.2010
comment
Да, но это было бы плохой практикой. Однако есть одна ситуация, в которой он используется, я добавлю его к описанию. - person Kornel Kisielewicz; 30.08.2010
comment
Однако ваш пример не будет работать, потому что obj находится в {} фигурных скобках. - person Kornel Kisielewicz; 30.08.2010
comment
+1 за предложение использовать cpp - очень полезно для препроцессорной отладки. - person namuol; 21.08.2013

Макрос запускает текстовую замену на этапе предварительной обработки (часть семи фаз компиляции). Возврат значения происходит во время выполнения. Вопрос не имеет смысла.

person dirkgently    schedule 30.08.2010

Макрос вашего примера заменяет текст macro1 на {obj1}. Он только заменяет текст другим текстом; он не знает концепции объектов или классов.

person apaderno    schedule 30.08.2010

Вы всегда можете увидеть, что делает компилятор, когда вы определяете макрос (и вызываете его). Код макроса просто заменяется (как и копипаст). Компилируйте с помощью 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
}
person bashrc    schedule 09.12.2011

Функциональный макрос - это не настоящие функции в смысле функции C ++: это просто инструкции предварительной обработки.

Ваш исходный файл сначала считывается препроцессором, макрос обрабатывается (расширяется, заменяется и т. Д.), А затем полученный исходный код передается компилятору.

Таким образом, макрос - это не что иное, как «копирование и вставка» текста в исходном файле. Таким образом, вы можете использовать макрос, содержащий оператор return, но он будет просто заменен в вашем коде.

См. Также Макросы, похожие на функции

person Cedric H.    schedule 30.08.2010