Не совсем.
Если у вас есть различные макросы, вы можете легко играть в такие игры:
#ifdef NDEBUG
#define log(...) (void)0
#else
#define log(...) do {printf("%s:%d: ", __FILE__, __LINE__); printf(__VA_ARGS__);} while(0)
#endif
Вы также можете включить или отключить ведение журналаболее тонкая гранулярность:
#define LOG_FLAGS <something>;
#define maybe_log(FLAG, ...) do { if (FLAG&LOG_FLAGS) printf(__VA_ARGS__);} while(0)
int some_function(int x, int y) {
maybe_log(FUNCTION_ENTRY, "x=%d;y=%d\n", x, y);
... do something ...
maybe_log(FUNCTION_EXIT, "result=%d\n", result);
return result;
}
Очевидно, что это может быть немного утомительно, если разрешить только один возврат из каждой функции, поскольку вы не можете напрямую получить возврат функции.
Любой изэти макросы и вызовы printf
могут быть заменены чем-то (другие макросы или вызовы переменных функций), что позволяет отделить фактический формат ведения журнала и цель от бизнес-логики, но факт выполнения какого-либо вида ведения журнала может 'На самом деле.
aspectc.org заявляет, что предлагает компилятор C и C ++ с языковыми расширениями, поддерживающими AOP.Я понятия не имею, в каком состоянии он находится, и если вы используете его, то, конечно, вы больше не пишете C (или C ++).
Помните, что C ++ имеет множественное наследование, что иногда полезно при перекрестномпроблемы.Имея достаточное количество шаблонов, вы можете делать замечательные вещи, возможно, даже реализуя собственную систему диспетчеризации методов, которая допускает какие-то точки соединения, но это очень важно.