如何在编译时查找函数是否为静态

时间:2011-05-12 15:42:33

标签: c++ static macros

我有记录宏,它记录了函数的这个指针,但问题是当在没有这个指针的静态函数中记录宏时,我得到编译错误。

例如

LOG_DEBUG(msg,...) \
   Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, this, msg, ## __VA_ARGS__);

我想知道是否有办法检查当前方法是否是静态的,我可以使用此指针或传递null并避免编译错误。

如果GNU提供任何预定义的宏来确定当前函数是静态的还是任何其他方式,请告诉我。

2 个答案:

答案 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所说,开发人员有责任传入这个

现在,我不会支持上述例子的质量,只能表达它所表达的精神。

相关问题