【发布时间】:2011-05-10 22:23:26
【问题描述】:
我已经习惯了:
class Db {
_Commit(char *file, int line) {
Log("Commit called from %s:%d", file, line);
}
};
#define Commit() _Commit(__FILE__, __LINE__)
但最大的问题是我在全球范围内重新定义了Commit 这个词,而在一个 400k 行的应用程序框架中这是一个问题。而且我不想使用像 DbCommit 这样的特定词:我不喜欢像 db->DbCommit() 这样的冗余,或者在任何地方手动传递值:db->Commit(__FILE__, __LINE__) 是最糟糕的。
那么,有什么建议吗?
【问题讨论】:
-
不要使用名称
_Commit。以下划线开头并以大写字母作为第二个字符,它是为实现而保留的,您使用它意味着您的程序具有未定义的行为。 -
换句话说,允许编译器定义一个名为
_Commit的宏,这会破坏你的代码。 -
是否允许不可移植且必须手动或通过使用
addr2line的脚本查找函数地址?在这种情况下,您可以使用 GCC 的 __builtin_return_address。记录地址而不是名称并不漂亮,但大概您只需要知道什么时候出了问题(这意味着很少),这样就可以了。好消息是它“正常工作”。我在异常中传递了最后三个调用者,这也很好(除了难以破译)。 -
猜猜看。这是不可能的。 FILE 和 LINE 都是 宏,并且必须从宏处理上下文中调用才能获得所需的效果..
标签: c++ c-preprocessor