Возвращаемое значение макроса - PullRequest
1 голос
/ 30 августа 2010

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

#define macro1 {obj1}

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

Спасибо.

Ответы [ 5 ]

8 голосов
/ 30 августа 2010

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

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

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

6 голосов
/ 30 августа 2010

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

3 голосов
/ 30 августа 2010

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

1 голос
/ 09 декабря 2011

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

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

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

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

См. Также Функциональные макросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...