как использовать '#define' для определения макроса, чтобы использовать множественный метод? - PullRequest
0 голосов
/ 01 февраля 2019

Я разрабатываю приложение для Mac, используя c ++.Я хочу определить макрос 'logi', соответствующий вызову двух методов, чтобы вызывались method1() и method2().Поэтому я попробовал это:

#define logi method1 method2

Не работает.Что такое стандартное написание этой ситуации?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Сначала: если вы можете, избегайте макросов.Если речь идет о вызове двух функций в последовательности, предпочтительнее вместо этого определить встроенную функцию:

inline void logi()
{
    method1();
    method2();
}

Хотя inline является просто рекомендацией для компилятора - и он может предпочесть этого не делать - для такихпростых функций, вы не найдете компилятор, который не следует этой рекомендации (скорее, функция будет встроена даже без ключевого слова).

Этот подход намного безопаснее - и все, что вы делаете неправильно, компилятор покажет вам прямо вопределение функции.

Если вы настаиваете на макросе: лучше всего, чтобы он выглядел как функция, если он ведет себя так, как в вашем случае:

#define logi() do { method1(); method2(); } while(false)

Обтекание циклавокруг делает этот макрос устойчивым, если его использовать как функцию где-то в коде, представьте, что он использовался без этого:

if(someCondition)
    logi();

Угадайте, method2 будет вызван безоговорочно (ну, другойпример, показывающий, почему рекомендуется всегда размещать фигурные скобки вокруг ветвей и петель ...).

Двоеточие iОн пропущен намеренно, поэтому пользователь вынужден поместить его, снова заставляя макрос вести себя как обычная функция.

Имейте в виду, что для макросов препроцессор делает только простую замену текста.Поэтому, что бы вы ни определяли, это должен быть действительный код C ++ (если быть точным: результат, когда пре-процессор завершен, должен быть действительным кодом).Как бы выглядел макрос, если бы вам нужно было передавать аргументы своим функциям?Ну, вам нужно включить их и в определение макроса:

#define logi(A1, A2, B1, B2, B3) do { method1(A1, A2); method2(B1, B2, B3) } while(false)
0 голосов
/ 01 февраля 2019

Полагаю, вы забыли только ';'между двумя функциями.Поэтому, что #define -macro является только текстовой заменой в вашем коде, вам нужно «завершить» вызов вашей функции с помощью «;».

Но вы можете захотеть переосмыслить, используя #define Макро таким образом.Мне кажется, не имеет смысла делать это таким образом.См. здесь на "когда использовать #define"

#include <iostream>
#define logi fun1(); fun2();  

void fun1(void)
{
  std::cout << "fun1 called\n";
}

void fun2(void)
{
  std::cout << "fun2 called\n";
}

int main(void)
{
  logi
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...