Сначала: если вы можете, избегайте макросов.Если речь идет о вызове двух функций в последовательности, предпочтительнее вместо этого определить встроенную функцию:
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)