我有记录宏,它记录了函数的这个指针,但问题是当在没有这个指针的静态函数中记录宏时,我得到编译错误。
例如
LOG_DEBUG(msg,...) \
Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, this, msg, ## __VA_ARGS__);
我想知道是否有办法检查当前方法是否是静态的,我可以使用此指针或传递null并避免编译错误。
如果GNU提供任何预定义的宏来确定当前函数是静态的还是任何其他方式,请告诉我。
答案 0 :(得分:3)
我会避免尝试自动检测并使其成为开发人员的责任 只是为没有这个值的情况提供另一个记录宏 当您错误地使用LOG_DEBUG()并且可以替换时,编译器将生成错误。
LOG_NON_OO_DEBUG(msg,...) \
Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, msg, ## __VA_ARGS__);
注意:我不会传递NULL(或者也不是0) 我会重载WriteLog()方法,以便它有一个不需要这个指针的版本。
答案 1 :(得分:1)
除了Martin的答案之外,这个是一个编译时构造,而宏是预处理器,所以没有办法测试这个的存在宏。在像perl这样不太强类型的语言中,您可以检查是否定义了符号,但由于C / C ++是强类型的,因此不需要这样的运算符。
修改的
我想澄清一下我在上一段中试图提出的观点。
预处理器是Cism。如果我不得不打赌,它可能只看到错误修复和其行为的微小变化,但在20年前与C的行为几乎相同。换句话说,预处理器并非设计用于特定于语言的功能。
static , this ,调用约定,类型等语言功能......预处理器不了解它们,也没有逻辑与他们合作。可以解决这个问题的唯一方法是,如果存在语言功能来测试 this 的定义,或者测试是否处于静态函数中。
/编辑
我倾向于建议您使用非宏方法进行日志记录,或者使用不太依赖于宏的解决方案。我看到使用宏的唯一优势是您无需在整个地方输入__FILE__
和__LINE__
。在这方面,我没有看到在宏中包装你想出的任何问题。
例如,您可以在类中添加一个通用函数,生成简洁的信息,如:
class MyClass {
private:
void MemberLogMsg();
public:
static void LogMsg( MyClass* M = NULL);
};
你的宏总是会调用LogMsg,而且正如Martin所说,开发人员有责任传入这个。
现在,我不会支持上述例子的质量,只能表达它所表达的精神。