Может ли макрос возвращать объект?Значение возврата макроса
#define macro1 {obj1}
Поскольку макрос является заменой текста, могу ли я использовать макрос как macro1.function1()?
Спасибо.
Может ли макрос возвращать объект?Значение возврата макроса
#define macro1 {obj1}
Поскольку макрос является заменой текста, могу ли я использовать макрос как macro1.function1()?
Спасибо.
Макрос никогда ничего не возвращает. Макрос возвращает текстовое представление кода, который будет вставлен в место программы, где он используется перед компиляцией.
Подробнее о C Preprocessor.
Итак:
#define macro1 {obj1}
int main() {
macro1
}
... будет составлен, как если бы вы написали
int main() {
{obj1}
}
Это просто текстовая замена, которая необязательно может принимать параметр.
Если вы используете GCC вы посмотрите на то, что программа будет выглядеть после предварительной обработки может, используя cpp
инструмент:
# cpp myprog.cpp myprog.cpp_out
Обычно смешивание макроса с объектами является плохой практикой, использование templates.
Одно известное использование макросов в терминах объектов используют их для доступа к одиночкам (однако это не такая хорошая идея в целом):
#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");
... но вышеупомянутые шаблоны сделать это лучше.
Спасибо. Могу ли я использовать функцию macro1.function в приведенном выше примере? – Steveng
Да, но это была бы плохая практика. Есть одна ситуация, в которой она используется, но я добавлю ее в описание. –
Ваш пример не будет работать, потому что 'obj' находится в' {} 'скобках. –
Макрос вызывает текстовую замену во время этапа предварительной обработки (часть семи фаз компиляции). Возврат значения происходит во время выполнения. Вопрос не имеет смысла.
Макрос вашего примера заменяет текст macro1
на {obj1}
. Он заменяет текст другим текстом; он не знает понятия объектов или классов.
Функциональные макросы не являются реальными функциями в смысле функции C++: они являются просто инструкциями предварительной обработки.
Исходный файл сначала считывается препроцессором, обрабатываются макросы (расширенные, замененные и т. Д.), А затем результирующий источник передается компилятору.
Итак, макрос не намного больше, чем просто «скопировать вставку» текста в исходный файл. Таким образом, вы можете использовать макрос, содержащий оператор return
, но он будет просто заменен в вашем коде.
Смотрите также Function-like macros
Вы всегда можете увидеть, что делает компилятор делать при определении макроса (и называют) .Отель код макроса просто заменяется (так же, как копировать вставить).
скомпилировать с 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
}
Почему вы не говорите нам большую проблему, которую вы пытаетесь решить, а не шаг. – GManNickG
@GManNickG Может быть, ему просто интересно узнать, что возможно ... –