dev*_*ium 7 c c++ logging aspects
我目前正在用C编码,我有很多printfs,所以我可以在某些时候跟踪我的应用程序的流程.问题是有时我想要比其他人更多的细节,所以我通常花时间评论/取消注释我的C代码,所以我可以获得适当的输出.
使用Java或C#时,我通常可以使用Aspects将我的实现代码与日志记录逻辑分开.
您是否在C中使用了类似的技术来解决这个问题?
我知道我可以放置一个名为DEBUG的标志,可以打开或关闭,所以每次我想要显示或隐藏printfs时,我都不必四处寻找并注释/取消注释我的整个代码.问题是我还想摆脱代码中的日志记录逻辑.
如果用C++编写代码而不是CI,它会更好吗?
似乎有一个AspectC++,所以对于C++似乎有一个解决方案.C怎么样?
谢谢
sbi*_*sbi 10
IME您无法真正将日志记录与要记录的算法分开.策略性地放置日志记录需要时间和经验.通常,代码会在整个生命周期内保持汇编日志语句(尽管它是渐近的).通常,日志记录随代码而发展.如果算法经常更改,通常会记录日志代码.
您可以做的是尽可能地使记录变得不引人注目.也就是说,确保日志记录语句始终是单行,不会破坏读取算法,使其他人可以将其他日志记录语句插入到现有算法中,而无需完全了解您的日志记录库等.
简而言之,就像处理字符串处理一样处理日志记录:将它包装在一个很好的小lib中,它将被包含在任何地方并使用,快速创建lib,并使其易于使用.
并不是的.
如果你有可变的宏,你可以轻松地玩这样的游戏:
#ifdef NDEBUG
#define log(...) (void)0
#else
#define log(...) do {printf("%s:%d: ", __FILE__, __LINE__); printf(__VA_ARGS__);} while(0)
#endif
Run Code Online (Sandbox Code Playgroud)
您还可以以更精细的粒度关闭和打开日志记录:
#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;
}
Run Code Online (Sandbox Code Playgroud)
显然,这可能有点单调乏味,只允许从每个函数返回一次,因为你无法直接获得函数返回.
任何这些宏和调用printf都可以替换为允许实际日志格式和目标与业务逻辑分离的东西(其他宏或可变函数调用),但某些日志记录的事实不能完成真的.
aspectc.org声称提供了一个C和C++编译器,其语言扩展支持AOP.我不知道它处于什么状态,如果你使用它,那么你当然不再真正编写C(或C++)了.
请记住,C++具有多重继承,这有时对横切关注有帮助.有足够的模板,您可以做出非凡的事情,甚至可能实现自己的方法调度系统,允许某种连接点,但这是一件很重要的事情.
| 归档时间: |
|
| 查看次数: |
1484 次 |
| 最近记录: |