2010-08-30 2 views
1

Может ли макрос возвращать объект?Значение возврата макроса

#define macro1 {obj1} 

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

Спасибо.

+2

Почему вы не говорите нам большую проблему, которую вы пытаетесь решить, а не шаг. – GManNickG

+0

@GManNickG Может быть, ему просто интересно узнать, что возможно ... –

ответ

7

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

Подробнее о 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"); 

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

+0

Спасибо. Могу ли я использовать функцию macro1.function в приведенном выше примере? – Steveng

+0

Да, но это была бы плохая практика. Есть одна ситуация, в которой она используется, но я добавлю ее в описание. –

+0

Ваш пример не будет работать, потому что 'obj' находится в' {} 'скобках. –

6

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

3

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

0

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

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

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

Смотрите также Function-like macros

1

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